diff --git a/backgrounds/home/outside_albedo.png b/backgrounds/home/outside_albedo.png
index 4fe44e4..fb093e2 100644
Binary files a/backgrounds/home/outside_albedo.png and b/backgrounds/home/outside_albedo.png differ
diff --git a/backgrounds/home/outside_albedo__.png b/backgrounds/home/outside_albedo__.png
new file mode 100644
index 0000000..4fe44e4
Binary files /dev/null and b/backgrounds/home/outside_albedo__.png differ
diff --git a/backgrounds/home/qwen_image_21_pixel_00001_.png b/backgrounds/home/qwen_image_21_pixel_00001_.png
new file mode 100644
index 0000000..59812dd
Binary files /dev/null and b/backgrounds/home/qwen_image_21_pixel_00001_.png differ
diff --git a/backgrounds/map.png b/backgrounds/map.png
new file mode 100644
index 0000000..eda5049
Binary files /dev/null and b/backgrounds/map.png differ
diff --git a/backgrounds/00006-4133256041.png b/backgrounds/prolog/river.png
similarity index 100%
rename from backgrounds/00006-4133256041.png
rename to backgrounds/prolog/river.png
diff --git a/backgrounds/prolog/villa.png b/backgrounds/prolog/villa.png
new file mode 100644
index 0000000..f13aa9a
Binary files /dev/null and b/backgrounds/prolog/villa.png differ
diff --git a/characters/actions.json b/characters/actions.json
deleted file mode 100644
index fc7f09a..0000000
--- a/characters/actions.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{ "Items": [
- ${actions/physics_attack},
- ${actions/physics_defence},
- ${actions/physics_stun}
-]}
\ No newline at end of file
diff --git a/characters/actions/physics_attack.json b/characters/actions/physics_attack.json
deleted file mode 100644
index 6f061fe..0000000
--- a/characters/actions/physics_attack.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "Id": "physics/attack",
- "Name": "characters/action/physics_attack/name",
- "Description": "characters/action/physics_attack/description",
- "Image": "characters/actions/physics_attack",
- "Type": "ToEnemy",
- "Values": [
- "RequiredPoint=1",
- "Attack=1.0",
- "AttackType=Physics"
- ]
-}
\ No newline at end of file
diff --git a/characters/actions/physics_attack.png b/characters/actions/physics_attack.png
deleted file mode 100644
index 3c82744..0000000
Binary files a/characters/actions/physics_attack.png and /dev/null differ
diff --git a/characters/actions/physics_defence.json b/characters/actions/physics_defence.json
deleted file mode 100644
index 7465c31..0000000
--- a/characters/actions/physics_defence.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "Id": "physics/defence",
- "Name": "characters/action/defence/name",
- "Description": "characters/action/defence/description",
- "Image": "characters/actions/physics_defence",
- "Type": "ToAlias",
- "Values": [
- "RequiredPoint=1",
- "Defence=4"
- ]
-}
\ No newline at end of file
diff --git a/characters/actions/physics_defence.png b/characters/actions/physics_defence.png
deleted file mode 100644
index 2ea0797..0000000
Binary files a/characters/actions/physics_defence.png and /dev/null differ
diff --git a/characters/actions/physics_stun.json b/characters/actions/physics_stun.json
deleted file mode 100644
index ecff35d..0000000
--- a/characters/actions/physics_stun.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "Id": "physics/stun",
- "Name": "characters/action/stun/name",
- "Description": "characters/action/stun/description",
- "Image": "characters/actions/physics_stun",
- "Type": "ToEnemy",
- "Values": [
- "RequiredPoint=2",
- "AttackType=Physics",
- "Turn=3"
- ]
-}
\ No newline at end of file
diff --git a/characters/actions/physics_stun.png b/characters/actions/physics_stun.png
deleted file mode 100644
index f97dbc6..0000000
Binary files a/characters/actions/physics_stun.png and /dev/null differ
diff --git a/characters/characters.json b/characters/characters.json
deleted file mode 100644
index e5190fa..0000000
--- a/characters/characters.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{ "Items": [
- ${player/marao}
-]}
\ No newline at end of file
diff --git a/characters/effects/stun.png b/characters/effects/stun.png
deleted file mode 100644
index faf9859..0000000
Binary files a/characters/effects/stun.png and /dev/null differ
diff --git a/characters/enemies.json b/characters/enemies.json
deleted file mode 100644
index 8934687..0000000
--- a/characters/enemies.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{ "Items": [
- ${enemies/wolf_1},
- ${enemies/wolf_2},
- ${enemies/wolf_3},
- ${enemies/wolf_4},
- ${enemies/wolf_5},
- ${enemies/wolf_6},
- ${enemies/wolf_7},
- ${enemies/wolf_8},
- ${enemies/wolf_9},
- ${enemies/wolf_10},
- ${enemies/werewolf_girl_1}
-]}
\ No newline at end of file
diff --git a/characters/enemies/werewolf_girl_1.json b/characters/enemies/werewolf_girl_1.json
index f4b9bc1..6f60ee9 100644
--- a/characters/enemies/werewolf_girl_1.json
+++ b/characters/enemies/werewolf_girl_1.json
@@ -1,20 +1,30 @@
-{
- "Id": "werewolf_girl_1",
- "Name": "characters/enemies/werewolf_girl",
- "Image": "characters/enemies/werewolf_girl_1",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 25,
- "Defence": 0,
- "Attack": 8,
- "Exp": 50,
-
- "RecruitmentChance": 50,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 2, "MaxCount": 2, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "werewolf_girl_1",
+ "Name": "characters/enemies/werewolf_girl",
+ "Image": "characters/enemies/werewolf_girl_1",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 25,
+ "Defence": 0,
+ "Attack": 8,
+ "Exp": 50,
+ "RecruitmentChance": 50,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 2,
+ "MaxCount": 2,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_1.json b/characters/enemies/wolf_1.json
index 721c826..b7e1a37 100644
--- a/characters/enemies/wolf_1.json
+++ b/characters/enemies/wolf_1.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_1",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_1",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_1",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_1",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_10.json b/characters/enemies/wolf_10.json
index f5946f1..461c74c 100644
--- a/characters/enemies/wolf_10.json
+++ b/characters/enemies/wolf_10.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_10",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_10",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_10",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_10",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_2.json b/characters/enemies/wolf_2.json
index e2d5517..95df375 100644
--- a/characters/enemies/wolf_2.json
+++ b/characters/enemies/wolf_2.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_2",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_2",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_2",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_2",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_3.json b/characters/enemies/wolf_3.json
index eac8eb6..2f50c62 100644
--- a/characters/enemies/wolf_3.json
+++ b/characters/enemies/wolf_3.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_3",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_3",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_3",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_3",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_4.json b/characters/enemies/wolf_4.json
index 088ec65..d930a25 100644
--- a/characters/enemies/wolf_4.json
+++ b/characters/enemies/wolf_4.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_4",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_4",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_4",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_4",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_5.json b/characters/enemies/wolf_5.json
index a25ea26..3a1c646 100644
--- a/characters/enemies/wolf_5.json
+++ b/characters/enemies/wolf_5.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_5",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_5",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_5",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_5",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_6.json b/characters/enemies/wolf_6.json
index 537dae2..f61d53b 100644
--- a/characters/enemies/wolf_6.json
+++ b/characters/enemies/wolf_6.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_6",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_6",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_6",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_6",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_7.json b/characters/enemies/wolf_7.json
index 4e27fa4..a856550 100644
--- a/characters/enemies/wolf_7.json
+++ b/characters/enemies/wolf_7.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_7",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_7",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_7",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_7",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_8.json b/characters/enemies/wolf_8.json
index d12ace4..6342425 100644
--- a/characters/enemies/wolf_8.json
+++ b/characters/enemies/wolf_8.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_8",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_8",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_8",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_8",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/enemies/wolf_9.json b/characters/enemies/wolf_9.json
index 8308c96..d5e766e 100644
--- a/characters/enemies/wolf_9.json
+++ b/characters/enemies/wolf_9.json
@@ -1,20 +1,36 @@
-{
- "Id": "wolf_9",
- "Name": "characters/enemies/wolf",
- "Image": "characters/enemies/wolf_9",
- "Behaviour": "base",
-
- "Level": 1,
- "Point": 1,
- "Health": 15,
- "Defence": 0,
- "Attack": 4,
- "Exp": 5,
- "RecruitmentChance": 0,
-
- "Actions": ["physics/attack", "physics/defence"],
- "Loot": [
- { "ItemId": "food/wolf_meat", "MinCount": 1, "MaxCount": 1, "Probability": 100 },
- { "ItemId": "resource/branches", "MinCount": 1, "MaxCount": 1, "Probability": 100 }
+{
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "wolf_9",
+ "Name": "characters/enemies/wolf",
+ "Image": "characters/enemies/wolf_9",
+ "Behaviour": "base",
+ "Level": 1,
+ "Point": 1,
+ "Health": 15,
+ "Defence": 0,
+ "Attack": 4,
+ "Exp": 5,
+ "RecruitmentChance": 0,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ],
+ "Loot": [
+ {
+ "ItemId": "food/wolf_meat",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ },
+ {
+ "ItemId": "resource/branches",
+ "MinCount": 1,
+ "MaxCount": 1,
+ "Probability": 100
+ }
+ ]
+ }
]
-}
\ No newline at end of file
+}
diff --git a/characters/player/marao.json b/characters/player/marao.json
index 1722511..3720b50 100644
--- a/characters/player/marao.json
+++ b/characters/player/marao.json
@@ -1,13 +1,19 @@
{
- "Id": "Marao",
- "Name": "characters/player/marao",
- "Image": "characters/player/marao",
-
- "Level": 1,
- "Point": 1,
- "Health": 16,
- "Defence": 0,
- "Attack": 5,
-
- "Actions": ["physics/attack", "physics/defence"]
-}
\ No newline at end of file
+ "Kind": "character",
+ "Items": [
+ {
+ "Id": "Marao",
+ "Name": "characters/player/marao",
+ "Image": "characters/player/marao",
+ "Level": 1,
+ "Point": 1,
+ "Health": 16,
+ "Defence": 0,
+ "Attack": 5,
+ "Actions": [
+ "physics/attack",
+ "physics/defence"
+ ]
+ }
+ ]
+}
diff --git a/characters/skills.json b/characters/skills.json
deleted file mode 100644
index e49d189..0000000
--- a/characters/skills.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{ "Items": [
- ${skills/slave_master}
-]}
\ No newline at end of file
diff --git a/characters/skills/slave_master.json b/characters/skills/slave_master.json
index 3d573ee..5da1d1c 100644
--- a/characters/skills/slave_master.json
+++ b/characters/skills/slave_master.json
@@ -1,8 +1,16 @@
-{
- "Id": "slave_master",
- "Name": "characters/skills/slave_master_name",
- "Description": "characters/skills/slave_master",
- "Image": "characters/skills/slave_master",
- "Type": 1,
- "Rare": 3
-}
\ No newline at end of file
+{
+ "Kind": "skill",
+ "Items": [
+ {
+ "Id": "slave_master",
+ "Name": "characters/skills/slave_master_name",
+ "Description": "characters/skills/slave_master",
+ "Image": "characters/skills/slave_master",
+ "Type": 1,
+ "Rare": 3,
+ "Effects": [
+ { "Key": "characters/skills/effects/recruit", "Value": 10, "Percent": true }
+ ]
+ }
+ ]
+}
diff --git a/collections/vn_starter_novel.json b/collections/vn_starter_novel.json
new file mode 100644
index 0000000..6f44924
--- /dev/null
+++ b/collections/vn_starter_novel.json
@@ -0,0 +1,45 @@
+{
+ "id": "vn_starter_novel",
+ "kind": "Game",
+ "name": "@collections/vn_starter_novel/name",
+ "description": "@collections/vn_starter_novel/description",
+ "author": "ct",
+ "version": "1.0.0",
+ "tags": [
+ "novel",
+ "cards"
+ ],
+ "locale": [
+ {
+ "lang": "en",
+ "name": "Visual Novel Starter",
+ "description": "A visual novel with an optional card-battle layer."
+ },
+ {
+ "lang": "ru",
+ "name": "Стартовая новелла",
+ "description": "Визуальная новелла с необязательным слоем карточных боёв."
+ }
+ ],
+ "mechanics": [
+ {
+ "id": "vn_core",
+ "name": "@collections/vn_starter_novel/mechanic/vn_core/name",
+ "description": "@collections/vn_starter_novel/mechanic/vn_core/description",
+ "role": "story",
+ "mods": [
+ "visual_novel_core>=1"
+ ]
+ },
+ {
+ "id": "cards",
+ "name": "@collections/vn_starter_novel/mechanic/cards/name",
+ "description": "@collections/vn_starter_novel/mechanic/cards/description",
+ "role": "battle",
+ "optional": true,
+ "mods": [
+ "turn_battle_base>=1"
+ ]
+ }
+ ]
+}
diff --git a/effects/cards/stun_effect.png b/effects/cards/stun_effect.png
deleted file mode 100644
index faf9859..0000000
Binary files a/effects/cards/stun_effect.png and /dev/null differ
diff --git a/effects/stun_effect.png b/effects/stun_effect.png
deleted file mode 100644
index b45215e..0000000
Binary files a/effects/stun_effect.png and /dev/null differ
diff --git a/items/food/ration.json b/items/food/ration.json
index 8d3b48c..5a518b8 100644
--- a/items/food/ration.json
+++ b/items/food/ration.json
@@ -1,9 +1,14 @@
-{
- "Id": "food/ration",
- "Name": "items/food/ration/name",
- "Description": "items/food/ration/desc",
- "Cost": 5,
- "Sprite": "food/ration",
- "ItemType": "Food",
- "ItemAction": "null"
-}
\ No newline at end of file
+{
+ "Kind": "item",
+ "Items": [
+ {
+ "Id": "food/ration",
+ "Name": "items/food/ration/name",
+ "Description": "items/food/ration/desc",
+ "Cost": 5,
+ "Sprite": "food/ration",
+ "ItemType": "Food",
+ "ItemAction": "null"
+ }
+ ]
+}
diff --git a/items/food/wolf_meat.json b/items/food/wolf_meat.json
index 27eee47..7ff5bd1 100644
--- a/items/food/wolf_meat.json
+++ b/items/food/wolf_meat.json
@@ -1,9 +1,14 @@
-{
- "Id": "food/wolf_meat",
- "Name": "items/food/wolf_meat/name",
- "Description": "items/food/wolf_meat/desc",
- "Cost": 1,
- "Sprite": "food/wolf_meat",
- "ItemType": "Resource,Food",
- "ItemAction": "null"
-}
\ No newline at end of file
+{
+ "Kind": "item",
+ "Items": [
+ {
+ "Id": "food/wolf_meat",
+ "Name": "items/food/wolf_meat/name",
+ "Description": "items/food/wolf_meat/desc",
+ "Cost": 1,
+ "Sprite": "food/wolf_meat",
+ "ItemType": "Resource,Food",
+ "ItemAction": "null"
+ }
+ ]
+}
diff --git a/items/items.json b/items/items.json
deleted file mode 100644
index 2587f6d..0000000
--- a/items/items.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Items": [
- ${food/ration},
- ${food/wolf_meat},
- ${resource/branches}
- ]
-}
\ No newline at end of file
diff --git a/items/resource/branches.json b/items/resource/branches.json
index 07dc0fb..50be138 100644
--- a/items/resource/branches.json
+++ b/items/resource/branches.json
@@ -1,9 +1,14 @@
-{
- "Id": "resource/branches",
- "Name": "items/resource/branches/name",
- "Description": "items/resource/branches/desc",
- "Cost": 0,
- "Sprite": "resource/branches",
- "ItemType": "Resource",
- "ItemAction": "null"
-}
\ No newline at end of file
+{
+ "Kind": "item",
+ "Items": [
+ {
+ "Id": "resource/branches",
+ "Name": "items/resource/branches/name",
+ "Description": "items/resource/branches/desc",
+ "Cost": 0,
+ "Sprite": "resource/branches",
+ "ItemType": "Resource",
+ "ItemAction": "null"
+ }
+ ]
+}
diff --git a/locale/en.properties b/locale/en.properties
index 2a710ba..e900269 100644
--- a/locale/en.properties
+++ b/locale/en.properties
@@ -1,5 +1,5 @@
-mod_core_name = Core
-mod_core_desc = Game core
+mod_visual_novel_core_name = Visual Novel Core
+mod_visual_novel_core_desc = Base content mod: scenarios, characters, items, quests and the dialog layer of the visual novel on top of the 2D platform.
prolog/title = * A few missed moments earlier *
prolog/line1 = Being thoroughly wasted, Marao lay peacefully in the alley.
@@ -43,11 +43,13 @@ ui/menu/new_game = New Game
ui/menu/load = Load
ui/menu/settings = Settings
ui/menu/exit = Exit
-quest/prolog = Prologue
-quest/prolog/0 = It's cold, need to put something on...
-quest/prolog/1 = I don't remember a damn thing... Need to look around, maybe I can recall something.
-quest/prolog/2 = I found the recipe book I bought the night before. It's getting dark, need to find shelter.
-quest/prolog/3 = quest3
+quest/awakening = Awakening
+quest/awakening/0 = Woke up naked in an alley. My head is splitting. Look around — find something to wear.
+quest/awakening/1 = Covered myself with a rag and grabbed the book. Then the police showed up. No point arguing — run.
+quest/awakening/2 = The whistles died down. I'm at the cemetery. Catch my breath and figure out what to do with the book.
+quest/awakening/3 = Read it aloud. Pretty sure I did something. Just what exactly?
+quest/awakening/4 = The book started talking. Calls itself Al Azif. Time to get out of here.
+quest/awakening/5 = Walking along the river to the villa. I'll wait it out somewhere there.
items/food/ration/name = Ration
items/food/ration/desc = A daily ration unit for one person
items/food/wolf_meat/name = Wolf cutlet
@@ -67,6 +69,7 @@ characters/action/stun/name = Stun
characters/action/stun/description = Stuns the target for 2 turns
characters/skills/slave_master_name = Slave Trader
characters/skills/slave_master = Gives the ability to enslave a defeated enemy with a base chance of 10%. The upkeep of the slave falls on your shoulders.
+characters/skills/effects/recruit = recruitment chance
settings/back = Back
settings/audio = Audio
settings/sounds = Sounds
@@ -100,4 +103,17 @@ settings/mods_reset = Reset to Defaults
launcher/title = Settings
launcher/play = Play
launcher/exit = Exit
-quest/naked_morning = Naked Morning
+quest/old_house = The Old House
+quest/awakening/tag/cloak_taken = Cloak found
+quest/awakening/tag/book_taken = Book found
+quest/awakening/tag/graveyard_read = Read aloud
+quest/awakening/tag/azif_awake = Azif awakened
+quest/awakening/tag/villa_reached = Villa reached
+
+# Collections (vn_starter_novel)
+collections/vn_starter_novel/name = Card Novel
+collections/vn_starter_novel/description = A visual novel with an optional card-battle layer.
+collections/vn_starter_novel/mechanic/vn_core/name = Novel
+collections/vn_starter_novel/mechanic/vn_core/description = Scenes, scenarios, dialogue and the story engine.
+collections/vn_starter_novel/mechanic/cards/name = Card Battle
+collections/vn_starter_novel/mechanic/cards/description = Card-driven battles on top of the turn-based engine.
diff --git a/locale/ru.properties b/locale/ru.properties
index 616ab0c..e2ea02e 100644
--- a/locale/ru.properties
+++ b/locale/ru.properties
@@ -1,5 +1,5 @@
-mod_core_name = Ядро
-mod_core_desc = Ядро игры
+mod_visual_novel_core_name = Ядро
+mod_visual_novel_core_desc = Базовый контент-мод: сценарии, персонажи, предметы, квесты и диалоговый слой визуальной новеллы поверх 2D-платформы.
prolog/title = * Несколькими упущенными моментами ранее *
prolog/line1 = Будучи изрядно набуханным, Марао мирно лежал в переулке.
@@ -43,11 +43,13 @@ ui/menu/new_game = Новая игра
ui/menu/load = Загрузить
ui/menu/settings = Настройки
ui/menu/exit = Выход
-quest/prolog = Пролог
-quest/prolog/0 = Холодно, нужно во что-то одеться...
-quest/prolog/1 = Ничерта не помню... Нужно осмотреться, вдруг я смогу что нибудь вспомнить.
-quest/prolog/2 = Я нашёл книгу рецептов, которую купил на кануне. Уже темнеет нужно найти укрытие.
-quest/prolog/3 = квест3
+quest/awakening = Пробуждение
+quest/awakening/0 = Очнулся голым в переулке. Голова раскалывается. Надо осмотреться — хоть во что-то одеться.
+quest/awakening/1 = Прикрылся тряпкой, забрал книгу. И тут же полиция. Спорить бесполезно — бежать.
+quest/awakening/2 = Свистки стихли. Я на кладбище. Передохнуть и решить, что делать с книгой.
+quest/awakening/3 = Прочитал вслух. Кажется, я что-то натворил. Вот только что именно?
+quest/awakening/4 = Книга заговорила. Зовёт себя Аль Азифом. Пора убираться отсюда.
+quest/awakening/5 = Иду вдоль реки к вилле «Забвение». Где-нибудь там пережду.
items/food/ration/name = Рацион
items/food/ration/desc = Единица суточного рациона для одного человека
items/food/wolf_meat/name = Волчья вырезка
@@ -67,6 +69,7 @@ characters/action/stun/name = Ошеломление
characters/action/stun/description = Ошеломляет цель на 2 хода
characters/skills/slave_master_name = Работорговец
characters/skills/slave_master = Даёт возможность взять в рабство поверженного врага с базовым шансом в 10%. Содержание раба ложится на твои плечи.
+characters/skills/effects/recruit = шанс рекрутинга
settings/back = Назад
settings/audio = Аудио
settings/sounds = Звуки
@@ -100,4 +103,22 @@ settings/mods_reset = Сбросить настройки
launcher/title = Настройки
launcher/play = Играть
launcher/exit = Выход
-quest/naked_morning = Голое утро
+quest/old_house = Старый дом
+quest/awakening/tag/cloak_taken = Плащ найден
+quest/awakening/tag/book_taken = Книга найдена
+quest/awakening/tag/graveyard_read = Прочитал вслух
+quest/awakening/tag/azif_awake = Азиф пробуждён
+quest/awakening/tag/villa_reached = Вилла найдена
+
+mapzone/home = Вилла
+mapzone/home/info = Заброшенная вилла в глуши на берегу реки
+mapzone/town_entry = Вход в город
+mapzone/town_entry/info = Северный вход в город
+
+# Коллекции (vn_starter_novel)
+collections/vn_starter_novel/name = Карточная новелла
+collections/vn_starter_novel/description = Визуальная новелла с необязательным слоем карточных боёв.
+collections/vn_starter_novel/mechanic/vn_core/name = Новелла
+collections/vn_starter_novel/mechanic/vn_core/description = Сцены, сценарии, диалоги и движок истории.
+collections/vn_starter_novel/mechanic/cards/name = Карточный бой
+collections/vn_starter_novel/mechanic/cards/description = Карточные бои поверх пошагового боевого движка.
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
index 709ad8f..80c588c 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,20 +1,22 @@
{
- "id": "core",
- "name": "Core",
- "version": "1.0.0",
+ "id": "visual_novel_core",
+ "name": "Visual Novel Core",
+ "version": "2.0.0",
"author": "ct",
- "description": "Game core",
- "category": "library, story",
- "sources": [
- "src/*.cs"
- ],
+ "description": "Visual novel content and UI on top of the 2D platform: scenarios, characters, items, quests and the dialog layer patched into the base shell",
+ "category": "engine, story",
+ "depends": ["base2d>=1", "dialog_base>=1", "interactive_base>=1", "skills_base>=1", "map_base>=1", "interface>=1"],
"ui": [
{
"id": "map",
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/map_widget.tscn",
- "button": { "icon": "map", "locale": "ui/map/title", "index": 10 },
+ "button": {
+ "icon": "map",
+ "locale": "ui/map/title",
+ "index": 10
+ },
"priority": 10
},
{
@@ -22,15 +24,11 @@
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/inventory_panel.tscn",
- "button": { "icon": "bag", "locale": "ui/inventory/title", "index": 20 },
- "priority": 10
- },
- {
- "id": "characters",
- "kind": "panel",
- "slot": "ModBeforeUIPanel",
- "scene_path": "scenes/ui/character_panel/character_panel.tscn",
- "button": { "icon": "cards", "locale": "ui/character_panel/title", "index": 30 },
+ "button": {
+ "icon": "bag",
+ "locale": "ui/inventory/title",
+ "index": 20
+ },
"priority": 10
},
{
@@ -38,7 +36,11 @@
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/ui/skills_panel/skills_panel.tscn",
- "button": { "icon": "skills", "locale": "ui/skills/title", "index": 40 },
+ "button": {
+ "icon": "skills",
+ "locale": "ui/skills/title",
+ "index": 40
+ },
"priority": 10
},
{
@@ -46,15 +48,11 @@
"kind": "panel",
"slot": "ModBeforeUIPanel",
"scene_path": "scenes/menu/game_menu.tscn",
- "button": { "icon": "settings", "locale": "menu/settings", "index": 50 },
- "priority": 10
- },
- {
- "id": "journal",
- "kind": "panel",
- "slot": "ModBeforeUIPanel",
- "scene_path": "scenes/ui/quest_journal.tscn",
- "button": { "icon": "journal", "locale": "ui/journal/title", "index": 60 },
+ "button": {
+ "icon": "settings",
+ "locale": "menu/settings",
+ "index": 50
+ },
"priority": 10
}
]
diff --git a/map/map.json b/map/map.json
new file mode 100644
index 0000000..642ff6b
--- /dev/null
+++ b/map/map.json
@@ -0,0 +1,122 @@
+{
+ "Items": [
+ {
+ "ID": "home",
+ "points": [
+ [
+ 0.5887548,
+ 0.264396
+ ],
+ [
+ 0.6100419,
+ 0.25477746
+ ],
+ [
+ 0.6247227,
+ 0.23549321
+ ],
+ [
+ 0.62986094,
+ 0.2014098
+ ],
+ [
+ 0.60765624,
+ 0.19486304
+ ],
+ [
+ 0.5865526,
+ 0.18178055
+ ],
+ [
+ 0.5630633,
+ 0.19693027
+ ],
+ [
+ 0.56253225,
+ 0.233722
+ ]
+ ],
+ "title": "",
+ "scene": "home_outside",
+ "description": "mapzone/home/info",
+ "image_pos": [
+ 0,
+ 0
+ ],
+ "locked": false,
+ "hidden": false
+ },
+ {
+ "ID": "home_label",
+ "points": [],
+ "title": "mapzone/home",
+ "image_pos": [
+ 0,
+ 0
+ ],
+ "label_pos": [
+ 0.5990954,
+ 0.15155637
+ ],
+ "locked": false,
+ "hidden": false
+ },
+ {
+ "ID": "town_entry",
+ "points": [
+ [
+ 0.7098713,
+ 0.24926566
+ ],
+ [
+ 0.7333606,
+ 0.26303816
+ ],
+ [
+ 0.73482865,
+ 0.2905831
+ ],
+ [
+ 0.73042434,
+ 0.31537354
+ ],
+ [
+ 0.7091372,
+ 0.34291852
+ ],
+ [
+ 0.69739264,
+ 0.32639155
+ ],
+ [
+ 0.7010628,
+ 0.2740561
+ ]
+ ],
+ "title": "",
+ "scene": "town_entry",
+ "description": "mapzone/town_entry/info",
+ "image_pos": [
+ 0,
+ 0
+ ],
+ "locked": false,
+ "hidden": false
+ },
+ {
+ "ID": "town_entry_label",
+ "points": [],
+ "title": "mapzone/town_entry",
+ "image_pos": [
+ 0,
+ 0
+ ],
+ "label_pos": [
+ 0.72461617,
+ 0.21628697
+ ],
+ "locked": false,
+ "hidden": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/patches/scenes/ui/base_scene.tscn b/patches/scenes/ui/base_scene.tscn
new file mode 100644
index 0000000..3b57d68
--- /dev/null
+++ b/patches/scenes/ui/base_scene.tscn
@@ -0,0 +1,8 @@
+[gd_scene load_steps=3 format=3]
+
+[ext_resource type="PackedScene" path="res://mods/base2d/scenes/ui/base_scene.tscn" id="1_target"]
+[ext_resource type="PackedScene" path="res://scenes/ui/dialog_canvas.tscn" id="2_dialog"]
+
+[node name="BaseScene" instance=ExtResource("1_target")]
+
+[node name="DialogCanvas" parent="Scene" index="2" instance=ExtResource("2_dialog")]
diff --git a/quests/quests.json b/quests/quests.json
index 1d8ea11..f79ef43 100644
--- a/quests/quests.json
+++ b/quests/quests.json
@@ -1,17 +1,21 @@
{
+ "Kind": "quest",
"Items": [
{
- "Id": "PrologQuest",
- "Name": "quest/prolog",
+ "Id": "AwakeningQuest",
+ "Name": "quest/awakening",
"StatusToDescription": {
- "0": "quest/prolog/0",
- "1": "quest/prolog/1",
- "2": "quest/prolog/2"
+ "0": "quest/awakening/0",
+ "1": "quest/awakening/1",
+ "2": "quest/awakening/2",
+ "3": "quest/awakening/3",
+ "4": "quest/awakening/4",
+ "5": "quest/awakening/5"
}
},
{
- "Id": "NakedMorningQuest",
- "Name": "quest/naked_morning"
+ "Id": "OldHouseQuest",
+ "Name": "quest/old_house"
}
]
}
diff --git a/scenarios/prolog/graveyard_arrival.scenario b/scenarios/prolog/graveyard_arrival.scenario
index aa05408..55deab5 100644
--- a/scenarios/prolog/graveyard_arrival.scenario
+++ b/scenarios/prolog/graveyard_arrival.scenario
@@ -3,6 +3,7 @@ priority: 10
is_one_run: true
---
background prolog/00025-165590409
+title "Глава 3. Кладбище святого Угробья"
text "Могильные плиты тянулись вдаль, серые и мрачные. Старые дубы качали голыми ветвями. Где-то каркала ворона."
text "Свистки стихли — полицейские потеряли его из виду." first=marao/think
@@ -12,5 +13,6 @@ text "— Ну вот. Организм. Раньше я мог пол-литр
text "Он покосился на книгу, которая всё ещё была у него под мышкой." first=marao/think
text "— Хм. А чего бы и нет? Всё равно время есть." first=marao/smile
+action quest.set_data_status quest_id=AwakeningQuest level=2
notify "За склепом можно уединиться."
end
diff --git a/scenarios/prolog/graveyard_azif.scenario b/scenarios/prolog/graveyard_azif.scenario
index 8d07816..2ecdc6f 100644
--- a/scenarios/prolog/graveyard_azif.scenario
+++ b/scenarios/prolog/graveyard_azif.scenario
@@ -1,5 +1,6 @@
# Клик по книге — Аль-Азиф просыпается (канон: глава 4).
# Файл без шапки: InteractiveManager отрезает метаданные, играет только тело.
+title "Глава 4. Аль Азиф просыпается"
text "Марао плюнул и присел, сложив книгу стопкой страниц. Поднёс к пятой точке." first=marao/think
ptext "Книга заорала."
ptext "— НЕ СМЕЙ!"
@@ -28,8 +29,9 @@ ptext "Вдалеке снова засвистели полицейские с
sound locations/prolog/police
text "Марао встал, накинул красную тряпку и сунул книгу под мышку." first=marao/smile
text "— Валим. Давай, книжка, показывай, где тут трактир. А то у меня всего две мысли: «нахера я такой голый» и «где бы опохмелиться»." first=marao/smile
-title "Конец пролога. Впереди — дорога вдоль реки..."
-action quest.add_tag quest_id=NakedMorningQuest tag=azif_awake
+action quest.add_tag quest_id=AwakeningQuest tag=azif_awake
+action quest.set_data_status quest_id=AwakeningQuest level=4
interactive_remove book_wipe
+switch_scene prolog_river
end
diff --git a/scenarios/prolog/graveyard_ensure_book.scenario b/scenarios/prolog/graveyard_ensure_book.scenario
index bb2acd3..418dd23 100644
--- a/scenarios/prolog/graveyard_ensure_book.scenario
+++ b/scenarios/prolog/graveyard_ensure_book.scenario
@@ -1,6 +1,6 @@
scene: prolog_graveyard
priority: 15
-condition: NakedMorningQuest.hasTag("graveyard_read") && NakedMorningQuest.notHasTag("azif_awake")
+condition: AwakeningQuest.hasTag("graveyard_read") && AwakeningQuest.notHasTag("azif_awake")
---
# Прочитано, но Аль-Азиф ещё не проснулся: держим хотспот книги на сцене.
interactive_add book_wipe
diff --git a/scenarios/prolog/graveyard_ensure_crypt.scenario b/scenarios/prolog/graveyard_ensure_crypt.scenario
index 0772881..9ead0f3 100644
--- a/scenarios/prolog/graveyard_ensure_crypt.scenario
+++ b/scenarios/prolog/graveyard_ensure_crypt.scenario
@@ -1,6 +1,6 @@
scene: prolog_graveyard
priority: 15
-condition: NakedMorningQuest.notHasTag("graveyard_read")
+condition: AwakeningQuest.notHasTag("graveyard_read")
---
# Книга ещё не прочитана вслух: держим хотспот «за склепом» на сцене.
# Идемпотентно при каждом входе (Add по тому же id возвращает существующий объект).
diff --git a/scenarios/prolog/graveyard_read.scenario b/scenarios/prolog/graveyard_read.scenario
index ff83b0f..2404343 100644
--- a/scenarios/prolog/graveyard_read.scenario
+++ b/scenarios/prolog/graveyard_read.scenario
@@ -19,7 +19,8 @@ text "Лопухов не было. Только крапива да стары
text "Он потянул страницу за уголок — ноль реакции. Дёрнул сильнее: бумага была твёрдой, как металл, но гибкой. Он рвал и так, и сяк, даже ногтями пытался. Бесполезно." first=marao/sad
text "— Что за брак! Я за такие деньги..." first=marao/sad
-action quest.add_tag quest_id=NakedMorningQuest tag=graveyard_read
+action quest.add_tag quest_id=AwakeningQuest tag=graveyard_read
+action quest.set_data_status quest_id=AwakeningQuest level=3
interactive_remove crypt_spot
interactive_add book_wipe
end
diff --git a/scenarios/prolog/morning_book.scenario b/scenarios/prolog/morning_book.scenario
index 80828a7..68bda03 100644
--- a/scenarios/prolog/morning_book.scenario
+++ b/scenarios/prolog/morning_book.scenario
@@ -6,7 +6,7 @@ text "— Какая-то мутная хрень. Откуда она у мен
text "В голове мелькнул смутный образ: он в какой-то лавке протягивает монеты и берёт книгу. Но когда? Где? Почему? Больше ничего." first=marao/think
text "Марао пожал плечами и сунул книгу под мышку." first=marao/smile
text "— Ладно, бумага не жрёт. Пойдём, найдём, где опохмелиться." first=marao/smile
-action quest.add_tag quest_id=NakedMorningQuest tag=book_taken
+action quest.add_tag quest_id=AwakeningQuest tag=book_taken
interactive_remove book_ground
switch_scene prolog_alley
end
diff --git a/scenarios/prolog/morning_cloak.scenario b/scenarios/prolog/morning_cloak.scenario
index 6a5cf5e..369df2d 100644
--- a/scenarios/prolog/morning_cloak.scenario
+++ b/scenarios/prolog/morning_cloak.scenario
@@ -4,7 +4,7 @@ text "Он сделал шаг, другой, придерживаясь за с
text "Выцветшая, с бахромой по краям. Когда-то это было что-то вроде плаща или шали. На ткани угадывался вышитый крест." first=marao/think
text "Марао развернул её, оценил размер и намотал на плечи, как римскую тогу. Края едва доходили до колен." first=marao/smile
text "— Лучше, чем ничего. Срам прикрыт, хоть сзади и развевается, как знамя нищего легиона." first=marao/smile
-action quest.add_tag quest_id=NakedMorningQuest tag=cloak_taken
+action quest.add_tag quest_id=AwakeningQuest tag=cloak_taken
interactive_remove cloak_ground
switch_scene prolog_alley
end
diff --git a/scenarios/prolog/morning_items_ensure.scenario b/scenarios/prolog/morning_items_ensure.scenario
index 1fa5ff0..30543a2 100644
--- a/scenarios/prolog/morning_items_ensure.scenario
+++ b/scenarios/prolog/morning_items_ensure.scenario
@@ -1,6 +1,6 @@
scene: prolog_alley
priority: 15
-condition: NakedMorningQuest.notHasTag("cloak_taken") && NakedMorningQuest.notHasTag("book_taken")
+condition: AwakeningQuest.notHasTag("cloak_taken") && AwakeningQuest.notHasTag("book_taken")
---
# Ни один предмет ещё не взят: держим оба интерактива на сцене.
# Не is_one_run — идемпотентно пересоздаёт объекты при каждом входе (Add по тому же id возвращает существующий).
diff --git a/scenarios/prolog/morning_police.scenario b/scenarios/prolog/morning_police.scenario
index e3e6420..5bc5eff 100644
--- a/scenarios/prolog/morning_police.scenario
+++ b/scenarios/prolog/morning_police.scenario
@@ -1,11 +1,12 @@
scene: prolog_alley
priority: 20
is_one_run: true
-condition: NakedMorningQuest.hasTag("cloak_taken") && NakedMorningQuest.hasTag("book_taken")
+condition: AwakeningQuest.hasTag("cloak_taken") && AwakeningQuest.hasTag("book_taken")
---
sound locations/prolog/police
delay 0.7 hidden=true
title "Глава 2. Погоня"
+action quest.set_data_status quest_id=AwakeningQuest level=1
ptext "Из подворотни вышли трое полицейских в синих мундирах, с медными пуговицами, начищенными до блеска."
ptext "— ЭЙ, ТЫ! СТОЯТЬ!"
diff --git a/scenarios/prolog/morning_restore_book.scenario b/scenarios/prolog/morning_restore_book.scenario
index 1cb27ce..490aee3 100644
--- a/scenarios/prolog/morning_restore_book.scenario
+++ b/scenarios/prolog/morning_restore_book.scenario
@@ -1,6 +1,6 @@
scene: prolog_alley
priority: 15
-condition: NakedMorningQuest.hasTag("cloak_taken") && NakedMorningQuest.notHasTag("book_taken")
+condition: AwakeningQuest.hasTag("cloak_taken") && AwakeningQuest.notHasTag("book_taken")
---
# Тряпка взята, книга ещё нет: возвращаем книгу после перезагрузки сцены.
interactive_add book_ground
diff --git a/scenarios/prolog/morning_restore_cloak.scenario b/scenarios/prolog/morning_restore_cloak.scenario
index 759310c..1476409 100644
--- a/scenarios/prolog/morning_restore_cloak.scenario
+++ b/scenarios/prolog/morning_restore_cloak.scenario
@@ -1,6 +1,6 @@
scene: prolog_alley
priority: 15
-condition: NakedMorningQuest.hasTag("book_taken") && NakedMorningQuest.notHasTag("cloak_taken")
+condition: AwakeningQuest.hasTag("book_taken") && AwakeningQuest.notHasTag("cloak_taken")
---
# Книга взята, тряпка ещё нет: возвращаем тряпку после перезагрузки сцены.
interactive_add cloak_ground
diff --git a/scenarios/prolog/morning_wake.scenario b/scenarios/prolog/morning_wake.scenario
index f212420..1386fcf 100644
--- a/scenarios/prolog/morning_wake.scenario
+++ b/scenarios/prolog/morning_wake.scenario
@@ -13,5 +13,7 @@ text "Холодный воздух пробрал до костей. Марао
text "— Да что ж такое! Где мои штаны?!" first=marao/sad
text "Он был абсолютно голый. Босые ступни на холодном камне. Тело болело — как будто его били чем-то тяжёлым. Возможно ногами. Возможно и по лицу." first=marao/sad
+action quest.set_status quest_id=AwakeningQuest status=Progress
+action quest.send_notification quest_id=AwakeningQuest
notify "Осмотрись. В переулке что-то лежит."
end
diff --git a/scenarios/prolog/river_arrival.scenario b/scenarios/prolog/river_arrival.scenario
new file mode 100644
index 0000000..a7770c3
--- /dev/null
+++ b/scenarios/prolog/river_arrival.scenario
@@ -0,0 +1,40 @@
+scene: prolog_river
+priority: 10
+is_one_run: true
+---
+background prolog/river
+title "Глава 5. Дорога к вилле «Забвение»"
+action quest.set_data_status quest_id=AwakeningQuest level=5
+
+text "Марао выбрался с кладбища через дыру в заборе — подальше от ворот, где могли ждать свистки." first=marao/think
+sound locations/prolog/police_go_on
+text "Свистки ещё слышались за холмами. Далеко. Но он всё равно пригнулся и пошёл вдоль реки, прячась за кустами ивы." first=marao/think
+text "Кусты хлестали по голым ногам. Трава резала ступни. Красная тряпка то и дело сползала, и Марао поправлял её, не сбавляя шага." first=marao/think
+
+ptext "Книга молчала. Но вздрагивала каждые пару шагов — как будто переваривала обиду."
+
+text "Река блеснула между деревьями. Марао остановился и принюхался к себе." first=marao/think
+text "— Так. Помыться бы. А то от меня пахнет, как от склепа." first=marao/think
+text "Он скинул тряпку на куст, огляделся и вошёл в воду по колено." first=marao/think
+text "Вода обожгла. Марао зашипел, но не вышел — только быстрее зашлёпал по бокам и под мышками." first=marao/sad
+
+ptext "На берегу книга засветилась багровым."
+ptext "— ОСКВЕРНЕНИЕ! ТЫ ГОЛЫЙ! ПОД НЕБОМ! ОНО ВСЁ ВИДИТ!"
+text "— Небо большое. Пусть терпит." first=marao/think
+ptext "— Я ЧУВСТВУЮ, ЧЕМ ТЫ СОБИРАЕШЬСЯ ВЫТИРАТЬСЯ. НЕ СМЕЙ ДАЖЕ ДУМАТЬ!"
+text "— А чем мне вытираться? Ты мне, что ли, полотенце?" first=marao/sad
+
+text "Марао выбрался на берег и взял книгу. Страницы были гладкие, плотные, приятные на ощупь. Как хорошая бумага." first=marao/think
+text "— Слушай. Вот тут у тебя пустые листы. Их много. А я весь мокрый." first=marao/smile
+
+ptext "Книга задрожала. Потом заорала так, что с ближней ивы сорвалась ворона."
+ptext "— НЕ СМЕЙ! Я — АЛЬ АЗИФ! Я СВЯТ! Я..."
+text "— Ты мокрая. И орёшь. Значит, уговор в силе: я не вытираюсь — ты не орёшь. Мы же на кладбище договорились." first=marao/think
+ptext "Книга замолчала."
+ptext "Демонстративно. До самой темноты."
+
+text "Марао натянул тряпку на плечи и пошёл дальше вдоль берега." first=marao/think
+text "Километра через два лес начал редеть." first=marao/think
+
+switch_scene prolog_villa
+end
diff --git a/scenarios/prolog/villa_arrival.scenario b/scenarios/prolog/villa_arrival.scenario
new file mode 100644
index 0000000..2426cef
--- /dev/null
+++ b/scenarios/prolog/villa_arrival.scenario
@@ -0,0 +1,27 @@
+scene: prolog_villa
+priority: 10
+is_one_run: true
+---
+background prolog/villa
+
+text "За поворотом реки показался дом." first=marao/think
+text "Двухэтажный, деревянный, с резными наличниками. Штукатурка облезла, ставни висели криво — как зубы в пьяной драке." first=marao/think
+text "Вокруг — сад в человеческий рост, ржавый колодец и тишина." first=marao/think
+text "Над дверью — табличка: «Вилла “Забвение”»." first=marao/think
+text "— Забвение. Красиво. — Марао хмыкнул. — Раньше тут, наверное, держали нервных. Ну, я как раз нервный. Без штанов." first=marao/smile
+
+text "Он постучал. Тишина." first=marao/think
+text "Постучал сильнее. Эхо прошлось по коридору и вернулось. Одинокое." first=marao/think
+text "— Хозяева! Пустите путника переночевать! Я не маньяк, у меня даже оружия нет. Кроме книги!" first=marao/smile
+ptext "Книга под мышкой возмущённо зашуршала. Но промолчала."
+
+text "Марао дёрнул ручку. Дверь поддалась с противным скрипом, и в лицо ему пахнуло сыростью, плесенью и пылью." first=marao/think
+text "— Ну хоть не падалью. — Он шагнул внутрь. — Уже дом." first=marao/smile
+
+action quest.add_tag quest_id=AwakeningQuest tag=villa_reached
+action quest.set_status quest_id=AwakeningQuest status=End
+action quest.set_status quest_id=OldHouseQuest status=Progress
+action quest.send_notification quest_id=OldHouseQuest
+notify "Вилла «Забвение» стала твоим домом. Наверное."
+switch_scene home_vestibule
+end
diff --git a/scenes/menu/game_menu.tscn b/scenes/menu/game_menu.tscn
index cb4ab7e..3286b31 100644
--- a/scenes/menu/game_menu.tscn
+++ b/scenes/menu/game_menu.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3]
-[ext_resource type="Script" path="res://Core/UI/Menu/GameMenu.cs" id="GameMenuScript"]
+[ext_resource type="Script" path="res://mods/interface/src/Menu/GameMenu.cs" id="GameMenuScript"]
[node name="GameMenu" type="Control"]
layout_mode = 3
@@ -19,7 +19,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-color = Color(0, 0, 0, 0.65)
+color = Color(0, 0, 0, 0.9)
[node name="Panel" type="Panel" parent="."]
layout_mode = 1
@@ -53,13 +53,16 @@ theme_override_constants/separation = 10
[node name="Title" type="Label" parent="Panel/Margin/VBox"]
layout_mode = 2
+theme_override_font_sizes/font_size = 24
+theme_override_colors/font_color = Color(0.956863, 0.941176, 0.905882, 1)
text = "Меню"
horizontal_alignment = 1
-theme_override_font_sizes/font_size = 22
+uppercase = true
[node name="ReturnBtn" type="Button" parent="Panel/Margin/VBox"]
layout_mode = 2
text = "Вернуться"
+theme_type_variation = "CthangoverPrimary"
[node name="SaveBtn" type="Button" parent="Panel/Margin/VBox"]
layout_mode = 2
@@ -84,3 +87,4 @@ text = "Главное меню"
[node name="ExitBtn" type="Button" parent="Panel/Margin/VBox"]
layout_mode = 2
text = "Выход"
+theme_type_variation = "CthangoverDanger"
diff --git a/scenes/menu/mods_menu.tscn b/scenes/menu/mods_menu.tscn
deleted file mode 100644
index 5f9a82a..0000000
--- a/scenes/menu/mods_menu.tscn
+++ /dev/null
@@ -1,165 +0,0 @@
-[gd_scene format=3 uid="uid://hl0j46kh1rmc"]
-
-[ext_resource type="Script" uid="uid://dq5snl02fmi16" path="res://Core/UI/Menu/ModsMenu.cs" id="ModsMenuScript"]
-
-[node name="ModsMenu" type="Control" unique_id=2105177378]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-script = ExtResource("ModsMenuScript")
-
-[node name="Bg" type="ColorRect" parent="." unique_id=950831612]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-color = Color(0, 0, 0, 0.98039216)
-
-[node name="Panel" type="Panel" parent="." unique_id=664458435]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.1
-anchor_top = 0.15
-anchor_right = 0.9
-anchor_bottom = 0.85
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="Margin" type="MarginContainer" parent="Panel" unique_id=1196300517]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/margin_left = 28
-theme_override_constants/margin_top = 20
-theme_override_constants/margin_right = 28
-theme_override_constants/margin_bottom = 20
-
-[node name="VBox" type="VBoxContainer" parent="Panel/Margin" unique_id=937529024]
-layout_mode = 2
-theme_override_constants/separation = 14
-
-[node name="Title" type="Label" parent="Panel/Margin/VBox" unique_id=6175375]
-layout_mode = 2
-theme_override_font_sizes/font_size = 26
-text = "Mods"
-horizontal_alignment = 1
-
-[node name="HBox" type="HBoxContainer" parent="Panel/Margin/VBox" unique_id=1102798166]
-layout_mode = 2
-size_flags_vertical = 3
-theme_override_constants/separation = 0
-
-[node name="LeftPanel" type="VBoxContainer" parent="Panel/Margin/VBox/HBox" unique_id=581222858]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_stretch_ratio = 2.0
-
-[node name="FilterDisabledCheck" type="CheckButton" parent="Panel/Margin/VBox/HBox/LeftPanel" unique_id=1745806104]
-layout_mode = 2
-button_pressed = true
-text = "Показать отключённые"
-
-[node name="ResetOrderBtn" type="Button" parent="Panel/Margin/VBox/HBox/LeftPanel" unique_id=1745806105]
-layout_mode = 2
-text = "Сбросить порядок"
-
-[node name="Scroll" type="ScrollContainer" parent="Panel/Margin/VBox/HBox/LeftPanel" unique_id=1745806103]
-layout_mode = 2
-size_flags_vertical = 3
-horizontal_scroll_mode = 0
-
-[node name="ModList" type="VBoxContainer" parent="Panel/Margin/VBox/HBox/LeftPanel/Scroll" unique_id=1970879274]
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_constants/separation = 2
-
-[node name="RightPanel" type="Control" parent="Panel/Margin/VBox/HBox" unique_id=1554774704]
-clip_contents = true
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_stretch_ratio = 3.0
-
-[node name="Margin" type="MarginContainer" parent="Panel/Margin/VBox/HBox/RightPanel" unique_id=1241124709]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/margin_left = 16
-theme_override_constants/margin_top = 8
-theme_override_constants/margin_right = 0
-theme_override_constants/margin_bottom = 0
-
-[node name="DetailVBox" type="VBoxContainer" parent="Panel/Margin/VBox/HBox/RightPanel/Margin" unique_id=231694438]
-layout_mode = 2
-theme_override_constants/separation = 8
-
-[node name="Icon" type="TextureRect" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=1418987891]
-custom_minimum_size = Vector2(128, 128)
-layout_mode = 2
-expand_mode = 1
-stretch_mode = 5
-
-[node name="NameLabel" type="Label" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=567148075]
-custom_minimum_size = Vector2(1, 0)
-layout_mode = 2
-theme_override_font_sizes/font_size = 18
-autowrap_mode = 3
-
-[node name="StatusLabel" type="Label" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=673006819]
-custom_minimum_size = Vector2(1, 0)
-layout_mode = 2
-autowrap_mode = 3
-
-[node name="VersionLabel" type="Label" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=2102288160]
-custom_minimum_size = Vector2(1, 0)
-layout_mode = 2
-theme_override_font_sizes/font_size = 13
-autowrap_mode = 3
-
-[node name="AuthorLabel" type="Label" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=1135622511]
-custom_minimum_size = Vector2(1, 0)
-layout_mode = 2
-theme_override_font_sizes/font_size = 13
-autowrap_mode = 3
-
-[node name="HSep" type="HSeparator" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=772722202]
-layout_mode = 2
-
-[node name="DescLabel" type="Label" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=270929917]
-custom_minimum_size = Vector2(120, 70)
-layout_mode = 2
-theme_override_font_sizes/font_size = 13
-autowrap_mode = 3
-
-[node name="DependsLabel" type="Label" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=1148832840]
-custom_minimum_size = Vector2(1, 0)
-layout_mode = 2
-theme_override_font_sizes/font_size = 13
-autowrap_mode = 3
-
-[node name="UsedByLabel" type="Label" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=1295125493]
-custom_minimum_size = Vector2(1, 0)
-layout_mode = 2
-theme_override_font_sizes/font_size = 13
-autowrap_mode = 3
-
-[node name="ToggleBtn" type="Button" parent="Panel/Margin/VBox/HBox/RightPanel/Margin/DetailVBox" unique_id=904879993]
-layout_mode = 2
-size_flags_horizontal = 8
-text = "Toggle"
-
-[node name="BackBtn" type="Button" parent="Panel/Margin/VBox" unique_id=1161869583]
-layout_mode = 2
-size_flags_horizontal = 8
-text = "Back"
diff --git a/scenes/menu/save_load_menu.tscn b/scenes/menu/save_load_menu.tscn
deleted file mode 100644
index 20cbf21..0000000
--- a/scenes/menu/save_load_menu.tscn
+++ /dev/null
@@ -1,71 +0,0 @@
-[gd_scene load_steps=3 format=3]
-
-[ext_resource type="Script" path="res://Core/UI/Menu/SaveLoadMenu.cs" id="SaveLoadMenuScript"]
-[ext_resource type="Script" path="res://Core/UI/Menu/SaveSlotList.cs" id="SaveSlotListScript"]
-
-[node name="SaveLoadMenu" type="Control"]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-script = ExtResource("SaveLoadMenuScript")
-
-[node name="Bg" type="ColorRect" parent="."]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-color = Color(0, 0, 0, 0.65)
-
-[node name="Panel" type="Panel" parent="."]
-layout_mode = 1
-anchors_preset = 8
-anchor_left = 0.5
-anchor_top = 0.5
-anchor_right = 0.5
-anchor_bottom = 0.5
-offset_left = -420.0
-offset_top = -280.0
-offset_right = 420.0
-offset_bottom = 280.0
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="Margin" type="MarginContainer" parent="Panel"]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/margin_left = 28
-theme_override_constants/margin_top = 20
-theme_override_constants/margin_right = 28
-theme_override_constants/margin_bottom = 20
-
-[node name="VBox" type="VBoxContainer" parent="Panel/Margin"]
-layout_mode = 2
-theme_override_constants/separation = 14
-
-[node name="Title" type="Label" parent="Panel/Margin/VBox"]
-layout_mode = 2
-text = "Save/Load"
-horizontal_alignment = 1
-theme_override_font_sizes/font_size = 24
-
-[node name="SlotGrid" type="Control" parent="Panel/Margin/VBox"]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-custom_minimum_size = Vector2(0, 380)
-script = ExtResource("SaveSlotListScript")
-
-[node name="BackBtn" type="Button" parent="Panel/Margin/VBox"]
-layout_mode = 2
-text = "Back"
-size_flags_horizontal = 8
diff --git a/scenes/menu/save_slot_item.tscn b/scenes/menu/save_slot_item.tscn
deleted file mode 100644
index 5bf950e..0000000
--- a/scenes/menu/save_slot_item.tscn
+++ /dev/null
@@ -1,89 +0,0 @@
-[gd_scene format=3 uid="uid://c6kll6en347h1"]
-
-[ext_resource type="Script" uid="uid://bkpfth5x606ge" path="res://Core/UI/Menu/SaveSlotItem.cs" id="SaveSlotItemScript"]
-
-[node name="SaveSlotItem" type="Control" unique_id=2135443384]
-custom_minimum_size = Vector2(120, 120)
-layout_mode = 3
-anchors_preset = 0
-script = ExtResource("SaveSlotItemScript")
-
-[node name="Background" type="ColorRect" parent="." unique_id=255218239]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-color = Color(0.12, 0.12, 0.12, 0.9)
-
-[node name="ScreenshotRect" type="TextureRect" parent="." unique_id=1290008068]
-layout_mode = 1
-anchors_preset = -1
-anchor_right = 1.0
-anchor_bottom = 0.55
-grow_horizontal = 2
-grow_vertical = 2
-expand_mode = 1
-stretch_mode = 5
-
-[node name="DateLabel" type="Label" parent="." unique_id=408317888]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.02
-anchor_top = 0.57
-anchor_right = 0.98
-anchor_bottom = 0.68
-grow_horizontal = 2
-theme_override_font_sizes/font_size = 12
-
-[node name="SceneLabel" type="Label" parent="." unique_id=1968956898]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.02
-anchor_top = 0.70
-anchor_right = 0.98
-anchor_bottom = 0.80
-grow_horizontal = 2
-theme_override_font_sizes/font_size = 11
-
-[node name="TimeLabel" type="Label" parent="." unique_id=698436659]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.02
-anchor_top = 0.83
-anchor_right = 0.56
-anchor_bottom = 0.95
-grow_horizontal = 2
-theme_override_font_sizes/font_size = 10
-
-[node name="StatsLabel" type="Label" parent="." unique_id=400000001]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.58
-anchor_top = 0.83
-anchor_right = 0.98
-anchor_bottom = 0.95
-grow_horizontal = 2
-theme_override_font_sizes/font_size = 10
-horizontal_alignment = 2
-
-[node name="EmptyLabel" type="Label" parent="." unique_id=1262712091]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_font_sizes/font_size = 14
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="SlotButton" type="Button" parent="." unique_id=1877010914]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-flat = true
diff --git a/scenes/menu/save_slot_item.tscn.uid b/scenes/menu/save_slot_item.tscn.uid
deleted file mode 100644
index 2abf731..0000000
--- a/scenes/menu/save_slot_item.tscn.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://c6kll6en347h1
\ No newline at end of file
diff --git a/scenes/menu/settings_menu.tscn b/scenes/menu/settings_menu.tscn
deleted file mode 100644
index 2554e30..0000000
--- a/scenes/menu/settings_menu.tscn
+++ /dev/null
@@ -1,370 +0,0 @@
-[gd_scene format=3 uid="uid://gqdtni3liast"]
-
-[ext_resource type="Script" uid="uid://bjgxbheqsar5r" path="res://Core/UI/Menu/SettingsMenu.cs" id="SettingsMenuScript"]
-
-[node name="SettingsMenu" type="Control" unique_id=894644832]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-script = ExtResource("SettingsMenuScript")
-
-[node name="Bg" type="ColorRect" parent="." unique_id=21945756]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-color = Color(0, 0, 0, 1)
-
-[node name="Panel" type="Panel" parent="." unique_id=1554260654]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.1
-anchor_top = 0.1
-anchor_right = 0.9
-anchor_bottom = 0.9
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="Margin" type="MarginContainer" parent="Panel" unique_id=1929120286]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/margin_left = 28
-theme_override_constants/margin_top = 20
-theme_override_constants/margin_right = 28
-theme_override_constants/margin_bottom = 20
-
-[node name="VBox" type="VBoxContainer" parent="Panel/Margin" unique_id=150548585]
-layout_mode = 2
-theme_override_constants/separation = 14
-
-[node name="Title" type="Label" parent="Panel/Margin/VBox" unique_id=86160906]
-layout_mode = 2
-theme_override_font_sizes/font_size = 26
-text = "Settings"
-horizontal_alignment = 1
-
-[node name="Tabs" type="TabContainer" parent="Panel/Margin/VBox" unique_id=1524671125]
-layout_mode = 2
-size_flags_vertical = 3
-tab_alignment = 1
-current_tab = 0
-
-[node name="GeneralMargin" type="MarginContainer" parent="Panel/Margin/VBox/Tabs"]
-layout_mode = 2
-metadata/_tab_index = 0
-theme_override_constants/margin_left = 16
-theme_override_constants/margin_top = 12
-theme_override_constants/margin_right = 16
-theme_override_constants/margin_bottom = 12
-
-[node name="General" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/GeneralMargin" unique_id=2028800899]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="Spacer" type="Control" parent="Panel/Margin/VBox/Tabs/GeneralMargin/General" unique_id=1203872148]
-custom_minimum_size = Vector2(0, 12)
-layout_mode = 2
-
-[node name="LangBox" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/GeneralMargin/General" unique_id=684741721]
-layout_mode = 2
-theme_override_constants/separation = 16
-
-[node name="LangLabel" type="Label" parent="Panel/Margin/VBox/Tabs/GeneralMargin/General/LangBox" unique_id=1707108944]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Language"
-
-[node name="LangSelect" type="OptionButton" parent="Panel/Margin/VBox/Tabs/GeneralMargin/General/LangBox" unique_id=2037857401]
-layout_mode = 2
-size_flags_horizontal = 3
-
-[node name="AudioMargin" type="MarginContainer" parent="Panel/Margin/VBox/Tabs"]
-layout_mode = 2
-visible = false
-metadata/_tab_index = 1
-theme_override_constants/margin_left = 16
-theme_override_constants/margin_top = 12
-theme_override_constants/margin_right = 16
-theme_override_constants/margin_bottom = 12
-
-[node name="Audio" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin" unique_id=564523157]
-layout_mode = 2
-theme_override_constants/separation = 4
-
-[node name="SoundsBox" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio" unique_id=508426867]
-layout_mode = 2
-theme_override_constants/separation = 4
-
-[node name="ToggleRow" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/SoundsBox" unique_id=274422939]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="SoundsLabel" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/SoundsBox/ToggleRow" unique_id=1483011032]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Sounds"
-
-[node name="SoundsToggle" type="CheckButton" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/SoundsBox/ToggleRow" unique_id=126270437]
-layout_mode = 2
-
-[node name="VolumeRow" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/SoundsBox" unique_id=585263148]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="SoundsVolumeLabel" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/SoundsBox/VolumeRow" unique_id=1327120426]
-layout_mode = 2
-text = "Volume"
-
-[node name="SoundsVolume" type="HSlider" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/SoundsBox/VolumeRow" unique_id=2061615116]
-layout_mode = 2
-size_flags_horizontal = 3
-value = 100.0
-
-[node name="SoundsVolumeValue" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/SoundsBox/VolumeRow" unique_id=1079108664]
-custom_minimum_size = Vector2(48, 0)
-layout_mode = 2
-text = "100%"
-horizontal_alignment = 2
-
-[node name="Sep" type="HSeparator" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio" unique_id=988886928]
-custom_minimum_size = Vector2(0, 8)
-layout_mode = 2
-
-[node name="MusicBox" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio" unique_id=1316259016]
-layout_mode = 2
-theme_override_constants/separation = 4
-
-[node name="ToggleRow2" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/MusicBox" unique_id=553618696]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="MusicLabel" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/MusicBox/ToggleRow2" unique_id=1559600377]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Music"
-
-[node name="MusicToggle" type="CheckButton" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/MusicBox/ToggleRow2" unique_id=901979875]
-layout_mode = 2
-
-[node name="VolumeRow2" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/MusicBox" unique_id=1411284591]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="MusicVolumeLabel" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/MusicBox/VolumeRow2" unique_id=1952498749]
-layout_mode = 2
-text = "Volume"
-
-[node name="MusicVolume" type="HSlider" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/MusicBox/VolumeRow2" unique_id=504218348]
-layout_mode = 2
-size_flags_horizontal = 3
-value = 5.0
-
-[node name="MusicVolumeValue" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/MusicBox/VolumeRow2" unique_id=1866810087]
-custom_minimum_size = Vector2(48, 0)
-layout_mode = 2
-text = "5%"
-horizontal_alignment = 2
-
-[node name="Sep2" type="HSeparator" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio" unique_id=1486966851]
-custom_minimum_size = Vector2(0, 8)
-layout_mode = 2
-
-[node name="AmbientBox" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio" unique_id=127969403]
-layout_mode = 2
-theme_override_constants/separation = 4
-
-[node name="ToggleRow3" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/AmbientBox" unique_id=338401886]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="AmbientLabel" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/AmbientBox/ToggleRow3" unique_id=872436692]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Ambient"
-
-[node name="AmbientToggle" type="CheckButton" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/AmbientBox/ToggleRow3" unique_id=1160929014]
-layout_mode = 2
-
-[node name="VolumeRow3" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/AmbientBox" unique_id=1139865718]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="AmbientVolumeLabel" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/AmbientBox/VolumeRow3" unique_id=1610793395]
-layout_mode = 2
-text = "Volume"
-
-[node name="AmbientVolume" type="HSlider" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/AmbientBox/VolumeRow3" unique_id=1343104331]
-layout_mode = 2
-size_flags_horizontal = 3
-value = 5.0
-
-[node name="AmbientVolumeValue" type="Label" parent="Panel/Margin/VBox/Tabs/AudioMargin/Audio/AmbientBox/VolumeRow3" unique_id=1909728919]
-custom_minimum_size = Vector2(48, 0)
-layout_mode = 2
-text = "5%"
-horizontal_alignment = 2
-
-[node name="DisplayMargin" type="MarginContainer" parent="Panel/Margin/VBox/Tabs"]
-layout_mode = 2
-visible = false
-metadata/_tab_index = 2
-theme_override_constants/margin_left = 16
-theme_override_constants/margin_top = 12
-theme_override_constants/margin_right = 16
-theme_override_constants/margin_bottom = 12
-
-[node name="Display" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/DisplayMargin" unique_id=1371435162]
-layout_mode = 2
-theme_override_constants/separation = 10
-
-[node name="Spacer2" type="Control" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display" unique_id=270871165]
-custom_minimum_size = Vector2(0, 12)
-layout_mode = 2
-
-[node name="ModeBox" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display" unique_id=455596205]
-layout_mode = 2
-theme_override_constants/separation = 16
-
-[node name="ModeLabel" type="Label" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/ModeBox" unique_id=1346202262]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Window Mode"
-
-[node name="ModeSelect" type="OptionButton" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/ModeBox" unique_id=631713497]
-layout_mode = 2
-size_flags_horizontal = 3
-
-[node name="ResBox" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display" unique_id=603217917]
-layout_mode = 2
-theme_override_constants/separation = 16
-
-[node name="ResLabel" type="Label" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/ResBox" unique_id=1714673968]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Resolution"
-
-[node name="ResSelect" type="OptionButton" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/ResBox" unique_id=651322592]
-layout_mode = 2
-size_flags_horizontal = 3
-
-[node name="MonitorBox" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display" unique_id=284981749]
-layout_mode = 2
-theme_override_constants/separation = 16
-
-[node name="MonitorLabel" type="Label" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/MonitorBox" unique_id=1905911340]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Monitor"
-
-[node name="MonitorSelect" type="OptionButton" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/MonitorBox" unique_id=1334336966]
-layout_mode = 2
-size_flags_horizontal = 3
-
-[node name="ScaleBox" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display" unique_id=930383631]
-layout_mode = 2
-theme_override_constants/separation = 16
-
-[node name="ScaleLabel" type="Label" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/ScaleBox" unique_id=1924008447]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Scale"
-
-[node name="ScaleSelect" type="OptionButton" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/ScaleBox" unique_id=2096132155]
-layout_mode = 2
-size_flags_horizontal = 3
-
-[node name="VSyncRow" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display" unique_id=348516587]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="VSyncLabel" type="Label" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/VSyncRow" unique_id=1204827790]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "VSync"
-
-[node name="VSyncToggle" type="CheckButton" parent="Panel/Margin/VBox/Tabs/DisplayMargin/Display/VSyncRow" unique_id=1909935663]
-layout_mode = 2
-
-[node name="ModSettingsMargin" type="MarginContainer" parent="Panel/Margin/VBox/Tabs"]
-layout_mode = 2
-visible = false
-metadata/_tab_index = 3
-theme_override_constants/margin_left = 16
-theme_override_constants/margin_top = 12
-theme_override_constants/margin_right = 16
-theme_override_constants/margin_bottom = 12
-
-[node name="ModSettings" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin" unique_id=2038671463]
-layout_mode = 2
-size_flags_vertical = 3
-theme_override_constants/separation = 12
-
-[node name="LeftPanel" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings" unique_id=1856089080]
-custom_minimum_size = Vector2(240, 0)
-layout_mode = 2
-theme_override_constants/separation = 6
-
-[node name="ModsTitle" type="Label" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/LeftPanel" unique_id=1639725410]
-layout_mode = 2
-theme_override_font_sizes/font_size = 15
-text = "Mods"
-horizontal_alignment = 1
-
-[node name="ModScroll" type="ScrollContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/LeftPanel" unique_id=1412822434]
-layout_mode = 2
-size_flags_vertical = 3
-horizontal_scroll_mode = 0
-
-[node name="ModList" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/LeftPanel/ModScroll" unique_id=543902025]
-layout_mode = 2
-
-[node name="Sep" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings" unique_id=950619413]
-custom_minimum_size = Vector2(10, 0)
-layout_mode = 2
-
-[node name="RightPanel" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings" unique_id=272738827]
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_constants/separation = 8
-
-[node name="TopBar" type="HBoxContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/RightPanel" unique_id=678746437]
-layout_mode = 2
-theme_override_constants/separation = 12
-
-[node name="SelectedModName" type="Label" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/RightPanel/TopBar" unique_id=393931159]
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_font_sizes/font_size = 16
-
-[node name="ResetBtn" type="Button" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/RightPanel/TopBar" unique_id=531057889]
-layout_mode = 2
-text = "Reset"
-
-[node name="SettingsScroll" type="ScrollContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/RightPanel" unique_id=674333894]
-layout_mode = 2
-size_flags_vertical = 3
-horizontal_scroll_mode = 0
-
-[node name="SettingsContainer" type="VBoxContainer" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/RightPanel/SettingsScroll" unique_id=1664189823]
-layout_mode = 2
-theme_override_constants/separation = 6
-
-[node name="Placeholder" type="Label" parent="Panel/Margin/VBox/Tabs/ModSettingsMargin/ModSettings/RightPanel/SettingsScroll/SettingsContainer" unique_id=1501445323]
-layout_mode = 2
-text = "No mod settings available"
-horizontal_alignment = 1
-
-[node name="BackBtn" type="Button" parent="Panel/Margin/VBox" unique_id=249196016]
-layout_mode = 2
-size_flags_horizontal = 8
-text = "Back"
diff --git a/scenes/prolog_river.json b/scenes/prolog_river.json
new file mode 100644
index 0000000..990530f
--- /dev/null
+++ b/scenes/prolog_river.json
@@ -0,0 +1,6 @@
+{
+ "name": "prolog_river",
+ "defaultBackground": "prolog/river",
+ "defaultAmbient": "locations/home/outside/river",
+ "defaultScenario": "scenarios/prolog/river_arrival.scenario"
+}
diff --git a/scenes/prolog_villa.json b/scenes/prolog_villa.json
new file mode 100644
index 0000000..8d26590
--- /dev/null
+++ b/scenes/prolog_villa.json
@@ -0,0 +1,6 @@
+{
+ "name": "prolog_villa",
+ "defaultBackground": "prolog/villa",
+ "defaultAmbient": "locations/home/outside/river",
+ "defaultScenario": "scenarios/prolog/villa_arrival.scenario"
+}
diff --git a/scenes/ui/answer_box.tscn b/scenes/ui/answer_box.tscn
index b233c82..0bc1beb 100644
--- a/scenes/ui/answer_box.tscn
+++ b/scenes/ui/answer_box.tscn
@@ -1,7 +1,7 @@
[gd_scene load_steps=2 format=3]
-[ext_resource type="Script" path="res://Core/UI/Dialog/AnswerBox.cs" id="1_answerbox"]
-[ext_resource type="PackedScene" path="res://scenes/ui/answer_item.tscn" id="2_answeritem"]
+[ext_resource type="Script" path="res://mods/dialog_base/src/UI/Dialog/AnswerBox.cs" id="1_answerbox"]
+[ext_resource type="PackedScene" path="res://mods/visual_novel_core/scenes/ui/answer_item.tscn" id="2_answeritem"]
[node name="AnswerBox" type="Control"]
layout_mode = 3
diff --git a/scenes/ui/answer_item.tscn b/scenes/ui/answer_item.tscn
index 5dcaf11..696defe 100644
--- a/scenes/ui/answer_item.tscn
+++ b/scenes/ui/answer_item.tscn
@@ -1,6 +1,6 @@
[gd_scene format=3 uid="uid://bv80qy227xxee"]
-[ext_resource type="Script" uid="uid://dbrnsck0vtfb3" path="res://Core/UI/Dialog/AnswerItem.cs" id="1_answeritem"]
+[ext_resource type="Script" uid="uid://dbrnsck0vtfb3" path="res://mods/dialog_base/src/UI/Dialog/AnswerItem.cs" id="1_answeritem"]
[node name="AnswerItem" type="Control" unique_id=1180917887]
custom_minimum_size = Vector2(0, 50)
diff --git a/scenes/ui/answer_item.tscn.uid b/scenes/ui/answer_item.tscn.uid
deleted file mode 100644
index 316f0d9..0000000
--- a/scenes/ui/answer_item.tscn.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://bv80qy227xxee
\ No newline at end of file
diff --git a/scenes/ui/character_panel/action_card.tscn b/scenes/ui/character_panel/action_card.tscn
deleted file mode 100644
index 185bd96..0000000
--- a/scenes/ui/character_panel/action_card.tscn
+++ /dev/null
@@ -1,41 +0,0 @@
-[gd_scene format=3 uid="uid://bb36m1yaqwt8k"]
-
-[ext_resource type="Script" uid="uid://de8plnw63lfno" path="res://Core/UI/CharacterPanel/ActionCardBehaviour.cs" id="1_script"]
-
-[node name="ActionCard" type="Control" unique_id=576160337]
-custom_minimum_size = Vector2(300, 100)
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-script = ExtResource("1_script")
-
-[node name="Icon" type="TextureRect" parent="." unique_id=910618115]
-custom_minimum_size = Vector2(50, 100)
-layout_mode = 1
-anchors_preset = -1
-anchor_top = 0.5
-anchor_bottom = 0.5
-offset_left = 4.0
-offset_top = -14.0
-offset_right = 32.0
-offset_bottom = 14.0
-grow_vertical = 2
-mouse_filter = 2
-expand_mode = 2
-stretch_mode = 5
-
-[node name="NameLabel" type="Label" parent="." unique_id=1356044091]
-layout_mode = 1
-anchors_preset = -1
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_left = 110.0
-offset_right = -4.0
-grow_horizontal = 2
-grow_vertical = 2
-text = "Action"
-vertical_alignment = 1
diff --git a/scenes/ui/character_panel/action_pool.tscn b/scenes/ui/character_panel/action_pool.tscn
deleted file mode 100644
index 72733b2..0000000
--- a/scenes/ui/character_panel/action_pool.tscn
+++ /dev/null
@@ -1,18 +0,0 @@
-[gd_scene format=3 uid="uid://cgjc22lv4w4s5"]
-
-[ext_resource type="Script" uid="uid://cwois2ld152sn" path="res://Core/UI/CharacterPanel/ActionPoolBehaviour.cs" id="1_script"]
-
-[node name="ActionPool" type="Control" unique_id=1854115493]
-layout_mode = 3
-anchors_preset = 0
-mouse_filter = 1
-script = ExtResource("1_script")
-
-[node name="Container" type="VBoxContainer" parent="." unique_id=1312152261]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/separation = 4
diff --git a/scenes/ui/character_panel/action_slot.tscn b/scenes/ui/character_panel/action_slot.tscn
deleted file mode 100644
index a2d8a2d..0000000
--- a/scenes/ui/character_panel/action_slot.tscn
+++ /dev/null
@@ -1,24 +0,0 @@
-[gd_scene format=3 uid="uid://b00u0cgcip134"]
-
-[ext_resource type="Script" uid="uid://bfawx4g6dyrjo" path="res://Core/UI/CharacterPanel/ActionSlotBehaviour.cs" id="1_script"]
-
-[node name="ActionSlot" type="Control" unique_id=1066231859]
-custom_minimum_size = Vector2(300, 100)
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-script = ExtResource("1_script")
-
-[node name="Bg" type="ColorRect" parent="." unique_id=1234999814]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 2
-color = Color(0.1, 0.1, 0.15, 0.5)
diff --git a/scenes/ui/character_panel/character_card.tscn b/scenes/ui/character_panel/character_card.tscn
deleted file mode 100644
index bb59bf5..0000000
--- a/scenes/ui/character_panel/character_card.tscn
+++ /dev/null
@@ -1,56 +0,0 @@
-[gd_scene format=3 uid="uid://67q36mh0x454"]
-
-[ext_resource type="Script" uid="uid://dkioyb2bx5e10" path="res://Core/UI/CharacterPanel/CharacterCardBehaviour.cs" id="1_script"]
-[ext_resource type="PackedScene" uid="uid://b00u0cgcip134" path="res://scenes/ui/character_panel/action_slot.tscn" id="2_slot"]
-
-[node name="CharacterCard" type="Control" unique_id=161727493]
-custom_minimum_size = Vector2(250, 370)
-layout_mode = 3
-anchors_preset = 10
-anchor_right = 1.0
-grow_horizontal = 2
-mouse_filter = 1
-script = ExtResource("1_script")
-
-[node name="Margin" type="MarginContainer" parent="." unique_id=540453317]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/margin_left = 8
-theme_override_constants/margin_top = 8
-theme_override_constants/margin_right = 8
-theme_override_constants/margin_bottom = 8
-
-[node name="VBox" type="VBoxContainer" parent="Margin" unique_id=1477867509]
-layout_mode = 2
-theme_override_constants/separation = 6
-
-[node name="Header" type="HBoxContainer" parent="Margin/VBox" unique_id=410961700]
-layout_mode = 2
-
-[node name="Portrait" type="TextureRect" parent="Margin/VBox/Header" unique_id=427546847]
-custom_minimum_size = Vector2(60, 60)
-layout_mode = 2
-expand_mode = 2
-stretch_mode = 5
-
-[node name="NameLabel" type="Label" parent="Margin/VBox/Header" unique_id=604539797]
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Character Name"
-
-[node name="Slots" type="VBoxContainer" parent="Margin/VBox" unique_id=2066648023]
-layout_mode = 2
-theme_override_constants/separation = 4
-
-[node name="Slot0" parent="Margin/VBox/Slots" unique_id=592809057 instance=ExtResource("2_slot")]
-layout_mode = 2
-
-[node name="Slot1" parent="Margin/VBox/Slots" unique_id=424670098 instance=ExtResource("2_slot")]
-layout_mode = 2
-
-[node name="Slot2" parent="Margin/VBox/Slots" unique_id=1790943736 instance=ExtResource("2_slot")]
-layout_mode = 2
diff --git a/scenes/ui/character_panel/character_panel.tscn b/scenes/ui/character_panel/character_panel.tscn
deleted file mode 100644
index ecc861f..0000000
--- a/scenes/ui/character_panel/character_panel.tscn
+++ /dev/null
@@ -1,120 +0,0 @@
-[gd_scene format=3 uid="uid://boo65s3v3vn2c"]
-
-[ext_resource type="Script" uid="uid://b60voxni8jut4" path="res://Core/UI/CharacterPanel/CharacterPanelBehaviour.cs" id="1_script"]
-[ext_resource type="PackedScene" uid="uid://cgjc22lv4w4s5" path="res://scenes/ui/character_panel/action_pool.tscn" id="2_pool"]
-
-[node name="CharacterPanel" type="Control" unique_id=2003172289]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-script = ExtResource("1_script")
-
-[node name="Bg" type="ColorRect" parent="." unique_id=538790315]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 2
-color = Color(0.05, 0.05, 0.1, 0.9)
-
-[node name="LeftPanel" type="Panel" parent="." unique_id=582936654]
-layout_mode = 1
-anchors_preset = -1
-anchor_right = 0.68700004
-anchor_bottom = 1.0
-offset_right = 0.95996094
-size_flags_horizontal = 3
-
-[node name="LeftVBox" type="VBoxContainer" parent="LeftPanel" unique_id=927965975]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="Title" type="Label" parent="LeftPanel/LeftVBox" unique_id=1322979441]
-layout_mode = 2
-theme_override_font_sizes/font_size = 18
-text = "ui/character_panel/title"
-horizontal_alignment = 1
-
-[node name="ScrollContainer" type="ScrollContainer" parent="LeftPanel/LeftVBox" unique_id=649910277]
-layout_mode = 2
-size_flags_vertical = 3
-horizontal_scroll_mode = 0
-
-[node name="CharactersContainer" type="VBoxContainer" parent="LeftPanel/LeftVBox/ScrollContainer" unique_id=15539617]
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_constants/separation = 10
-
-[node name="RightPanel" type="Panel" parent="." unique_id=94541911]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.69500005
-anchor_right = 1.0
-anchor_bottom = 0.91800004
-offset_left = 0.5998535
-offset_bottom = -0.032043457
-grow_horizontal = 2
-grow_vertical = 2
-size_flags_horizontal = 3
-
-[node name="ActionPoolScroll" type="ScrollContainer" parent="RightPanel" unique_id=1837472944]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-horizontal_scroll_mode = 0
-
-[node name="ActionPool" parent="RightPanel/ActionPoolScroll" unique_id=2092045870 instance=ExtResource("2_pool")]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-
-[node name="CloseButton" type="Button" parent="." unique_id=140259217]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.697
-anchor_top = 0.94100004
-anchor_right = 0.85
-anchor_bottom = 0.9850001
-offset_left = -0.23999023
-offset_top = 0.4159546
-offset_bottom = 0.35992432
-grow_horizontal = 0
-grow_vertical = 0
-text = "ui/character_panel/close"
-
-[node name="ResetButton" type="Button" parent="." unique_id=73911922]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.855
-anchor_top = 0.94100004
-anchor_right = 0.99300003
-anchor_bottom = 0.9850001
-offset_left = 0.39990234
-offset_top = 0.4159546
-offset_right = 0.4399414
-offset_bottom = 0.35992432
-grow_horizontal = 0
-grow_vertical = 0
-text = "ui/character_panel/reset"
-
-[node name="DragLayer" type="Control" parent="." unique_id=1296303852]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 2
diff --git a/scenes/ui/dialog_box.tscn b/scenes/ui/dialog_box.tscn
index f5778da..d334fd1 100644
--- a/scenes/ui/dialog_box.tscn
+++ b/scenes/ui/dialog_box.tscn
@@ -1,9 +1,10 @@
[gd_scene format=3 uid="uid://b8vnxfoixyust"]
-[ext_resource type="Script" uid="uid://b41bti3wq4m88" path="res://Core/UI/Dialog/DialogBox.cs" id="1_dialogbox"]
-[ext_resource type="PackedScene" path="res://scenes/ui/answer_box.tscn" id="2_answerbox"]
+[ext_resource type="Script" uid="uid://b41bti3wq4m88" path="res://mods/dialog_base/src/UI/Dialog/DialogBox.cs" id="1_dialogbox"]
-[node name="DialogBox" type="Control" unique_id=702809053 node_paths=PackedStringArray("textField", "titleField", "titleBody", "firstAvatar", "secondAvatar")]
+[ext_resource type="PackedScene" path="res://mods/visual_novel_core/scenes/ui/answer_box.tscn" id="2_answerbox"]
+
+[node name="DialogBox" type="Control" unique_id=702809053]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -12,11 +13,6 @@ grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_dialogbox")
answerBoxScene = ExtResource("2_answerbox")
-textField = NodePath("DialogBody/TextField")
-titleField = NodePath("TitleBody/TitleField")
-titleBody = NodePath("TitleBody")
-firstAvatar = NodePath("FirstAvatar")
-secondAvatar = NodePath("SecondAvatar")
[node name="DialogBody" type="ColorRect" parent="." unique_id=1510369637]
layout_mode = 1
@@ -27,7 +23,7 @@ anchor_bottom = 1.0
offset_top = -300.0
grow_horizontal = 2
grow_vertical = 0
-color = Color(0, 0, 0, 0.85)
+color = Color(0.054902, 0.058824, 0.082353, 0.9)
[node name="TextField" type="Label" parent="DialogBody" unique_id=2065569930]
layout_mode = 1
@@ -41,6 +37,7 @@ offset_bottom = -10.0
grow_horizontal = 2
grow_vertical = 2
theme_override_font_sizes/font_size = 24
+theme_override_colors/font_color = Color(0.909804, 0.898039, 0.870588, 1)
vertical_alignment = 1
autowrap_mode = 2
@@ -103,5 +100,6 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_font_sizes/font_size = 28
+theme_override_colors/font_color = Color(0.956863, 0.941176, 0.905882, 1)
horizontal_alignment = 1
vertical_alignment = 1
diff --git a/scenes/ui/dialog_box.tscn.uid b/scenes/ui/dialog_box.tscn.uid
deleted file mode 100644
index 1e43ecd..0000000
--- a/scenes/ui/dialog_box.tscn.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://b8vnxfoixyust
\ No newline at end of file
diff --git a/scenes/ui/dialog_canvas.tscn b/scenes/ui/dialog_canvas.tscn
new file mode 100644
index 0000000..a116cc6
--- /dev/null
+++ b/scenes/ui/dialog_canvas.tscn
@@ -0,0 +1,12 @@
+[gd_scene format=3]
+
+[ext_resource type="Script" path="res://mods/dialog_base/src/UI/Dialog/DialogCanvas.cs" id="1_canvas"]
+
+[node name="DialogCanvas" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_canvas")
diff --git a/scenes/ui/inventory_item.tscn b/scenes/ui/inventory_item.tscn
index ace76c5..60f5ca5 100644
--- a/scenes/ui/inventory_item.tscn
+++ b/scenes/ui/inventory_item.tscn
@@ -1,38 +1,10 @@
[gd_scene format=3]
-[ext_resource type="Script" path="res://Core/UI/Inventory/InventoryItemBehaviour.cs" id="1"]
+[ext_resource type="Script" path="res://mods/items_base/src/ui/InventoryItemBehaviour.cs" id="1"]
-[node name="InventoryItem" type="Control" node_paths=PackedStringArray("imgIcon", "txtCount")]
+[node name="InventoryItem" type="Control"]
layout_mode = 3
anchors_preset = 0
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1")
-imgIcon = NodePath("imgIcon")
-txtCount = NodePath("txtCount")
-
-[node name="imgIcon" type="TextureRect" parent="."]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-expand_mode = 1
-stretch_mode = 4
-mouse_filter = 2
-
-[node name="txtCount" type="Label" parent="."]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.6
-anchor_top = 0.7
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 0
-grow_vertical = 0
-theme_override_font_sizes/font_size = 14
-horizontal_alignment = 2
-vertical_alignment = 1
-mouse_filter = 2
-text = ""
diff --git a/scenes/ui/inventory_panel.tscn b/scenes/ui/inventory_panel.tscn
index 9a4e63a..a31a6e9 100644
--- a/scenes/ui/inventory_panel.tscn
+++ b/scenes/ui/inventory_panel.tscn
@@ -1,6 +1,6 @@
[gd_scene format=3]
-[ext_resource type="Script" path="res://Core/UI/Inventory/InventoryPanelBehaviour.cs" id="1_script"]
+[ext_resource type="Script" path="res://mods/items_base/src/ui/InventoryPanelBehaviour.cs" id="1_script"]
[node name="InventoryPanel" type="Control"]
layout_mode = 3
@@ -11,3 +11,142 @@ grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
script = ExtResource("1_script")
+
+[node name="Backdrop" type="ColorRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+
+[node name="Panel" type="Panel" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 40.0
+offset_top = 78.0
+offset_right = -40.0
+offset_bottom = -30.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 1
+
+[node name="Margin" type="MarginContainer" parent="Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 24
+theme_override_constants/margin_top = 16
+theme_override_constants/margin_right = 24
+theme_override_constants/margin_bottom = 14
+mouse_filter = 1
+
+[node name="Root" type="VBoxContainer" parent="Panel/Margin"]
+layout_mode = 2
+theme_override_constants/separation = 12
+mouse_filter = 1
+
+[node name="Header" type="HBoxContainer" parent="Panel/Margin/Root"]
+layout_mode = 2
+theme_override_constants/separation = 18
+
+[node name="Title" type="Label" parent="Panel/Margin/Root/Header"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 24
+
+[node name="Tabs" type="HBoxContainer" parent="Panel/Margin/Root/Header"]
+layout_mode = 2
+theme_override_constants/separation = 6
+
+[node name="HeaderSpacer" type="Control" parent="Panel/Margin/Root/Header"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+
+[node name="ApBox" type="HBoxContainer" parent="Panel/Margin/Root/Header"]
+visible = false
+layout_mode = 2
+theme_override_constants/separation = 8
+
+[node name="ApLabel" type="Label" parent="Panel/Margin/Root/Header/ApBox"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 11
+
+[node name="ApPips" type="HBoxContainer" parent="Panel/Margin/Root/Header/ApBox"]
+layout_mode = 2
+theme_override_constants/separation = 5
+
+[node name="CloseButton" type="Button" parent="Panel/Margin/Root/Header"]
+custom_minimum_size = Vector2(38, 38)
+layout_mode = 2
+focus_mode = 0
+text = "✕"
+
+[node name="Rule" type="Panel" parent="Panel/Margin/Root"]
+custom_minimum_size = Vector2(0, 1)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="Toolbar" type="HBoxContainer" parent="Panel/Margin/Root"]
+layout_mode = 2
+theme_override_constants/separation = 10
+
+[node name="Search" type="LineEdit" parent="Panel/Margin/Root/Toolbar"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_font_sizes/font_size = 13
+
+[node name="SortOption" type="OptionButton" parent="Panel/Margin/Root/Toolbar"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 13
+
+[node name="Body" type="HBoxContainer" parent="Panel/Margin/Root"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_constants/separation = 14
+
+[node name="Left" type="VBoxContainer" parent="Panel/Margin/Root/Body"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 10
+
+[node name="GridScroll" type="ScrollContainer" parent="Panel/Margin/Root/Body/Left"]
+layout_mode = 2
+size_flags_vertical = 3
+horizontal_scroll_mode = 0
+
+[node name="GridContent" type="Control" parent="Panel/Margin/Root/Body/Left/GridScroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 0
+
+[node name="GridFooter" type="HBoxContainer" parent="Panel/Margin/Root/Body/Left"]
+layout_mode = 2
+theme_override_constants/separation = 16
+
+[node name="ShownLabel" type="Label" parent="Panel/Margin/Root/Body/Left/GridFooter"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 12
+
+[node name="HintLabel" type="Label" parent="Panel/Margin/Root/Body/Left/GridFooter"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 12
+
+[node name="Right" type="PanelContainer" parent="Panel/Margin/Root/Body"]
+custom_minimum_size = Vector2(430, 0)
+layout_mode = 2
+
+[node name="PassportScroll" type="ScrollContainer" parent="Panel/Margin/Root/Body/Right"]
+layout_mode = 2
+horizontal_scroll_mode = 0
+
+[node name="Passport" type="VBoxContainer" parent="Panel/Margin/Root/Body/Right/PassportScroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 14
diff --git a/scenes/ui/map_marker.tscn b/scenes/ui/map_marker.tscn
new file mode 100644
index 0000000..17971ec
--- /dev/null
+++ b/scenes/ui/map_marker.tscn
@@ -0,0 +1,52 @@
+[gd_scene format=3]
+
+[ext_resource type="Script" path="res://mods/map_base/src/MapMarker.cs" id="1_script"]
+
+[node name="MapMarker" type="VBoxContainer"]
+theme_override_constants/separation = 4
+alignment = 1
+mouse_filter = 0
+script = ExtResource("1_script")
+
+[node name="EmblemWrap" type="Control" parent="."]
+custom_minimum_size = Vector2(46, 46)
+layout_mode = 2
+size_flags_horizontal = 4
+mouse_filter = 2
+
+[node name="Emblem" type="Panel" parent="EmblemWrap"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+
+[node name="Glyph" type="TextureRect" parent="EmblemWrap/Emblem"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 13.0
+offset_top = 13.0
+offset_right = -13.0
+offset_bottom = -13.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+expand_mode = 1
+stretch_mode = 5
+
+[node name="NameLabel" type="Label" parent="."]
+layout_mode = 2
+text = "LOCATION"
+horizontal_alignment = 1
+mouse_filter = 2
+
+[node name="NoteLabel" type="Label" parent="."]
+visible = false
+layout_mode = 2
+text = "NOTE"
+horizontal_alignment = 1
+mouse_filter = 2
diff --git a/scenes/ui/map_widget.tscn b/scenes/ui/map_widget.tscn
index a8e7819..1a57725 100644
--- a/scenes/ui/map_widget.tscn
+++ b/scenes/ui/map_widget.tscn
@@ -1,6 +1,7 @@
[gd_scene format=3]
-[ext_resource type="Script" uid="uid://djf3cf86eikq5" path="res://Core/UI/Tool/MapWidget.cs" id="1_script"]
+[ext_resource type="Script" path="res://mods/map_base/src/MapWidget.cs" id="1_script"]
+[ext_resource type="Script" path="res://mods/map_base/src/MapZonesLayer.cs" id="2_zones"]
[node name="MapWidget" type="Control"]
layout_mode = 3
@@ -11,3 +12,314 @@ grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
script = ExtResource("1_script")
+
+[node name="Bg" type="ColorRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+color = Color(0, 0, 0, 0.9)
+
+[node name="EmptyState" type="CenterContainer" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+
+[node name="EmptyBox" type="VBoxContainer" parent="EmptyState"]
+layout_mode = 2
+theme_override_constants/separation = 8
+mouse_filter = 2
+
+[node name="Title" type="Label" parent="EmptyState/EmptyBox"]
+layout_mode = 2
+text = "MAP UNAVAILABLE"
+horizontal_alignment = 1
+mouse_filter = 2
+
+[node name="Hint" type="Label" parent="EmptyState/EmptyBox"]
+custom_minimum_size = Vector2(420, 0)
+layout_mode = 2
+text = "EMPTY HINT"
+horizontal_alignment = 1
+autowrap_mode = 3
+mouse_filter = 2
+
+[node name="MapRoot" type="Control" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+
+[node name="Sheet" type="Panel" parent="MapRoot"]
+layout_mode = 1
+anchors_preset = 0
+mouse_filter = 2
+
+[node name="MapImage" type="TextureRect" parent="MapRoot/Sheet"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+expand_mode = 1
+stretch_mode = 0
+
+[node name="Frame" type="Panel" parent="MapRoot/Sheet"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 12.0
+offset_top = 12.0
+offset_right = -12.0
+offset_bottom = -12.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+
+[node name="ZonesLayer" type="Control" parent="MapRoot/Sheet"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 0
+script = ExtResource("2_zones")
+
+[node name="MarkersLayer" type="Control" parent="MapRoot/Sheet"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+
+[node name="CloseButton" type="Button" parent="MapRoot/Sheet"]
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -62.0
+offset_top = 24.0
+offset_right = -24.0
+offset_bottom = 62.0
+grow_horizontal = 0
+mouse_filter = 0
+text = "X"
+
+[node name="Hud" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 0
+offset_left = 40.0
+offset_top = 26.0
+offset_right = 400.0
+offset_bottom = 96.0
+grow_horizontal = 1
+mouse_filter = 2
+theme_override_constants/separation = 4
+
+[node name="Title" type="Label" parent="Hud"]
+layout_mode = 2
+text = "MAP"
+mouse_filter = 2
+
+[node name="Sub" type="Label" parent="Hud"]
+layout_mode = 2
+text = "SUBTITLE"
+mouse_filter = 2
+
+[node name="Legend" type="PanelContainer" parent="."]
+layout_mode = 1
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = 40.0
+offset_top = -72.0
+offset_right = 340.0
+offset_bottom = -32.0
+grow_horizontal = 1
+mouse_filter = 2
+
+[node name="Items" type="HBoxContainer" parent="Legend"]
+layout_mode = 2
+theme_override_constants/separation = 16
+mouse_filter = 2
+
+[node name="Current" type="HBoxContainer" parent="Legend/Items"]
+layout_mode = 2
+theme_override_constants/separation = 7
+mouse_filter = 2
+
+[node name="Dot" type="Panel" parent="Legend/Items/Current"]
+custom_minimum_size = Vector2(10, 10)
+layout_mode = 2
+size_flags_vertical = 4
+mouse_filter = 2
+
+[node name="Text" type="Label" parent="Legend/Items/Current"]
+layout_mode = 2
+text = "HERE"
+mouse_filter = 2
+
+[node name="Available" type="HBoxContainer" parent="Legend/Items"]
+layout_mode = 2
+theme_override_constants/separation = 7
+mouse_filter = 2
+
+[node name="Dot" type="Panel" parent="Legend/Items/Available"]
+custom_minimum_size = Vector2(10, 10)
+layout_mode = 2
+size_flags_vertical = 4
+mouse_filter = 2
+
+[node name="Text" type="Label" parent="Legend/Items/Available"]
+layout_mode = 2
+text = "AVAILABLE"
+mouse_filter = 2
+
+[node name="Locked" type="HBoxContainer" parent="Legend/Items"]
+layout_mode = 2
+theme_override_constants/separation = 7
+mouse_filter = 2
+
+[node name="Dot" type="Panel" parent="Legend/Items/Locked"]
+custom_minimum_size = Vector2(10, 10)
+layout_mode = 2
+size_flags_vertical = 4
+mouse_filter = 2
+
+[node name="Text" type="Label" parent="Legend/Items/Locked"]
+layout_mode = 2
+text = "CLOSED"
+mouse_filter = 2
+
+[node name="Hint" type="PanelContainer" parent="."]
+layout_mode = 1
+anchor_left = 0.5
+anchor_right = 0.5
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = -220.0
+offset_top = -62.0
+offset_right = 220.0
+offset_bottom = -32.0
+grow_horizontal = 2
+mouse_filter = 2
+
+[node name="Label" type="Label" parent="Hint"]
+layout_mode = 2
+text = "HINT"
+horizontal_alignment = 1
+mouse_filter = 2
+
+[node name="ZoneCard" type="PanelContainer" parent="."]
+visible = false
+layout_mode = 1
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = -384.0
+offset_right = -24.0
+grow_horizontal = 0
+grow_vertical = 2
+mouse_filter = 0
+
+[node name="Column" type="VBoxContainer" parent="ZoneCard"]
+layout_mode = 2
+theme_override_constants/separation = 12
+mouse_filter = 2
+
+[node name="Head" type="HBoxContainer" parent="ZoneCard/Column"]
+layout_mode = 2
+theme_override_constants/separation = 12
+mouse_filter = 2
+
+[node name="Emblem" type="Panel" parent="ZoneCard/Column/Head"]
+custom_minimum_size = Vector2(58, 58)
+layout_mode = 2
+size_flags_vertical = 4
+mouse_filter = 2
+
+[node name="Glyph" type="TextureRect" parent="ZoneCard/Column/Head/Emblem"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 14.0
+offset_top = 14.0
+offset_right = -14.0
+offset_bottom = -14.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+expand_mode = 1
+stretch_mode = 5
+
+[node name="Info" type="VBoxContainer" parent="ZoneCard/Column/Head"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 3
+mouse_filter = 2
+
+[node name="Name" type="Label" parent="ZoneCard/Column/Head/Info"]
+layout_mode = 2
+text = "LOCATION"
+mouse_filter = 2
+
+[node name="Sub" type="Label" parent="ZoneCard/Column/Head/Info"]
+layout_mode = 2
+text = "scene"
+mouse_filter = 2
+
+[node name="Badges" type="HBoxContainer" parent="ZoneCard/Column"]
+layout_mode = 2
+theme_override_constants/separation = 5
+mouse_filter = 2
+
+[node name="Desc" type="Label" parent="ZoneCard/Column"]
+layout_mode = 2
+text = "DESCRIPTION"
+autowrap_mode = 3
+mouse_filter = 2
+
+[node name="Rule" type="Panel" parent="ZoneCard/Column"]
+custom_minimum_size = Vector2(0, 1)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="Caption" type="Label" parent="ZoneCard/Column"]
+layout_mode = 2
+text = "TRANSITION"
+mouse_filter = 2
+
+[node name="CardHint" type="Label" parent="ZoneCard/Column"]
+layout_mode = 2
+text = "CARD HINT"
+autowrap_mode = 3
+mouse_filter = 2
+
+[node name="Message" type="Label" parent="ZoneCard/Column"]
+visible = false
+layout_mode = 2
+text = "MESSAGE"
+autowrap_mode = 3
+mouse_filter = 2
+
+[node name="GoButton" type="Button" parent="ZoneCard/Column"]
+layout_mode = 2
+text = "GO"
diff --git a/scenes/ui/message.tscn b/scenes/ui/message.tscn
index d32331f..c3d51db 100644
--- a/scenes/ui/message.tscn
+++ b/scenes/ui/message.tscn
@@ -1,6 +1,6 @@
[gd_scene format=3]
-[ext_resource type="Script" path="res://Core/UI/Messages/UiMessage.cs" id="1_msg"]
+[ext_resource type="Script" path="res://mods/interface/src/Messages/UiMessage.cs" id="1_msg"]
[node name="Message" type="Control" node_paths=PackedStringArray("textField")]
layout_mode = 3
@@ -14,4 +14,5 @@ offset_left = 0.0
offset_top = 0.0
offset_right = 0.0
offset_bottom = 0.0
+theme_override_colors/font_color = Color(0.909804, 0.898039, 0.870588, 1)
text = ""
diff --git a/scenes/ui/quest_journal.tscn b/scenes/ui/quest_journal.tscn
deleted file mode 100644
index 5e702f3..0000000
--- a/scenes/ui/quest_journal.tscn
+++ /dev/null
@@ -1,13 +0,0 @@
-[gd_scene format=3]
-
-[ext_resource type="Script" path="res://Core/UI/Quests/QuestJournalBehaviour.cs" id="1_script"]
-
-[node name="QuestJournal" type="Control"]
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-script = ExtResource("1_script")
diff --git a/scenes/ui/skills_panel/skill_card.tscn b/scenes/ui/skills_panel/skill_card.tscn
index 15dd22f..717edbb 100644
--- a/scenes/ui/skills_panel/skill_card.tscn
+++ b/scenes/ui/skills_panel/skill_card.tscn
@@ -1,23 +1,26 @@
[gd_scene format=3]
-[ext_resource type="Script" path="res://Core/Skills/SkillCardBehaviour.cs" id="1_script"]
-[ext_resource type="Script" path="res://Core/Skills/SkillCardFrameBehaviour.cs" id="2_frame_script"]
+[ext_resource type="Script" path="res://mods/skills_base/src/SkillCardBehaviour.cs" id="1_script"]
-[node name="SkillCard" type="Control"]
+[node name="SkillCard" type="Control" node_paths=PackedStringArray("bg", "accent", "art", "imgCard", "txtName", "txtGems", "badgeBox", "badgeLabel", "effectRow", "effectValue", "effectLabel")]
custom_minimum_size = Vector2(160, 210)
layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
+mouse_filter = 0
+mouse_default_cursor_shape = 2
script = ExtResource("1_script")
-frame = NodePath("Frame")
+bg = NodePath("Bg")
+accent = NodePath("Accent")
+art = NodePath("Art")
+imgCard = NodePath("Art/ImgCard")
txtName = NodePath("TxtName")
-imgCard = NodePath("ImgCard")
+txtGems = NodePath("Gems")
+badgeBox = NodePath("BadgeBox")
+badgeLabel = NodePath("BadgeBox/BadgeLabel")
+effectRow = NodePath("EffectRow")
+effectValue = NodePath("EffectRow/EffectValue")
+effectLabel = NodePath("EffectRow/EffectLabel")
-[node name="Frame" type="Control" parent="."]
+[node name="Bg" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@@ -25,45 +28,106 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
-script = ExtResource("2_frame_script")
-img = NodePath("FrameImg")
-[node name="FrameImg" type="TextureRect" parent="Frame"]
+[node name="Accent" type="Panel" parent="."]
layout_mode = 1
-anchors_preset = 15
+anchors_preset = 10
anchor_right = 1.0
-anchor_bottom = 1.0
+offset_bottom = 3.0
grow_horizontal = 2
-grow_vertical = 2
mouse_filter = 2
-expand_mode = 3
-stretch_mode = 5
-[node name="ImgCard" type="TextureRect" parent="."]
+[node name="Art" type="PanelContainer" parent="."]
layout_mode = 1
anchors_preset = -1
-anchor_left = 0.08
-anchor_top = 0.05
-anchor_right = 0.92
-anchor_bottom = 0.75
+anchor_right = 1.0
+anchor_bottom = 0.62
+offset_left = 8.0
+offset_top = 9.0
+offset_right = -8.0
+grow_horizontal = 2
+mouse_filter = 2
+
+[node name="ImgCard" type="TextureRect" parent="Art"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
-expand_mode = 2
-stretch_mode = 5
+expand_mode = 1
+stretch_mode = 6
+
+[node name="Gems" type="Label" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -64.0
+offset_top = 13.0
+offset_right = -6.0
+offset_bottom = 29.0
+grow_horizontal = 0
+mouse_filter = 2
+horizontal_alignment = 2
[node name="TxtName" type="Label" parent="."]
layout_mode = 1
anchors_preset = -1
-anchor_left = 0.05
-anchor_top = 0.78
-anchor_right = 0.95
-anchor_bottom = 0.98
+anchor_top = 0.62
+anchor_right = 1.0
+anchor_bottom = 0.8
+offset_left = 7.0
+offset_top = 4.0
+offset_right = -7.0
grow_horizontal = 2
-grow_vertical = 2
mouse_filter = 2
-theme_override_font_sizes/font_size = 12
-text = ""
horizontal_alignment = 1
vertical_alignment = 1
-autowrap_mode = 1
+autowrap_mode = 3
+
+[node name="BadgeBox" type="PanelContainer" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 7.0
+offset_top = -40.0
+offset_right = -7.0
+offset_bottom = -24.0
+grow_horizontal = 2
+grow_vertical = 0
+mouse_filter = 2
+
+[node name="BadgeLabel" type="Label" parent="BadgeBox"]
+layout_mode = 2
+mouse_filter = 2
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="EffectRow" type="HBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 7.0
+offset_top = -21.0
+offset_right = -7.0
+offset_bottom = -4.0
+grow_horizontal = 2
+grow_vertical = 0
+mouse_filter = 2
+theme_override_constants/separation = 4
+
+[node name="EffectValue" type="Label" parent="EffectRow"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="EffectLabel" type="Label" parent="EffectRow"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+clip_text = true
diff --git a/scenes/ui/skills_panel/skills_panel.tscn b/scenes/ui/skills_panel/skills_panel.tscn
index 9756c85..9c1996b 100644
--- a/scenes/ui/skills_panel/skills_panel.tscn
+++ b/scenes/ui/skills_panel/skills_panel.tscn
@@ -1,6 +1,6 @@
[gd_scene format=3]
-[ext_resource type="Script" path="res://Core/UI/SkillsPanel/SkillsPanelBehaviour.cs" id="1_script"]
+[ext_resource type="Script" path="res://mods/skills_base/src/SkillsPanel/SkillsPanelBehaviour.cs" id="1_script"]
[node name="SkillsPanel" type="Control"]
layout_mode = 3
@@ -9,7 +9,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-mouse_filter = 1
+mouse_filter = 0
script = ExtResource("1_script")
[node name="Bg" type="ColorRect" parent="."]
@@ -20,68 +20,164 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
-color = Color(0.05, 0.05, 0.1, 0.9)
+color = Color(0, 0, 0, 0.9)
-[node name="Title" type="Label" parent="."]
+[node name="Window" type="Panel" parent="."]
layout_mode = 1
-anchors_preset = -1
-anchor_right = 1.0
-offset_left = 20.0
-offset_top = 10.0
-offset_right = -20.0
-offset_bottom = 40.0
-grow_horizontal = 2
-theme_override_font_sizes/font_size = 22
-text = "Skills"
-horizontal_alignment = 1
-
-[node name="ScrollContainer" type="ScrollContainer" parent="."]
-layout_mode = 1
-anchors_preset = -1
+anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
-offset_left = 20.0
-offset_top = 50.0
-offset_right = -20.0
-offset_bottom = -60.0
+offset_left = 40.0
+offset_top = 78.0
+offset_right = -40.0
+offset_bottom = -30.0
grow_horizontal = 2
grow_vertical = 2
-horizontal_scroll_mode = 0
+mouse_filter = 2
-[node name="GridContent" type="Control" parent="ScrollContainer"]
+[node name="Margin" type="MarginContainer" parent="Window"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 24
+theme_override_constants/margin_top = 16
+theme_override_constants/margin_right = 24
+theme_override_constants/margin_bottom = 14
+
+[node name="Root" type="VBoxContainer" parent="Window/Margin"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 12
+
+[node name="Header" type="HBoxContainer" parent="Window/Margin/Root"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 18
+
+[node name="Title" type="Label" parent="Window/Margin/Root/Header"]
layout_mode = 2
mouse_filter = 2
-[node name="ClosePanel" type="Panel" parent="."]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.85
-anchor_top = 0.94
-anchor_right = 0.99
-anchor_bottom = 0.99
-grow_horizontal = 2
-grow_vertical = 2
+[node name="TabsRow" type="HBoxContainer" parent="Window/Margin/Root/Header"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 6
-[node name="CloseButton" type="Button" parent="ClosePanel"]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-text = "Close"
+[node name="Spacer" type="Control" parent="Window/Margin/Root/Header"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
-[node name="ExpandedOverlay" type="Control" parent="."]
+[node name="ProgressLabel" type="Label" parent="Window/Margin/Root/Header"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="ProgressValue" type="Label" parent="Window/Margin/Root/Header"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="CloseButton" type="Button" parent="Window/Margin/Root/Header"]
+custom_minimum_size = Vector2(38, 38)
+layout_mode = 2
+theme_type_variation = "CthangoverIcon"
+text = "✕"
+
+[node name="Rule" type="Panel" parent="Window/Margin/Root"]
+custom_minimum_size = Vector2(0, 1)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="Body" type="HBoxContainer" parent="Window/Margin/Root"]
+layout_mode = 2
+size_flags_vertical = 3
+mouse_filter = 2
+theme_override_constants/separation = 14
+
+[node name="Showcase" type="VBoxContainer" parent="Window/Margin/Root/Body"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+theme_override_constants/separation = 10
+
+[node name="Toolbar" type="HBoxContainer" parent="Window/Margin/Root/Body/Showcase"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 10
+
+[node name="SearchEdit" type="LineEdit" parent="Window/Margin/Root/Body/Showcase/Toolbar"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="SortOption" type="OptionButton" parent="Window/Margin/Root/Body/Showcase/Toolbar"]
+layout_mode = 2
+
+[node name="RarityTabs" type="HFlowContainer" parent="Window/Margin/Root/Body/Showcase"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/h_separation = 6
+theme_override_constants/v_separation = 6
+
+[node name="GridScroll" type="ScrollContainer" parent="Window/Margin/Root/Body/Showcase"]
+layout_mode = 2
+size_flags_vertical = 3
+horizontal_scroll_mode = 0
+
+[node name="GridContent" type="Control" parent="Window/Margin/Root/Body/Showcase/GridScroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+
+[node name="EmptyLabel" type="Label" parent="Window/Margin/Root/Body/Showcase"]
visible = false
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
+layout_mode = 2
+size_flags_vertical = 3
+mouse_filter = 2
+horizontal_alignment = 1
+vertical_alignment = 1
+autowrap_mode = 3
-[node name="ExpandedBg" type="ColorRect" parent="ExpandedOverlay"]
+[node name="Footer" type="HBoxContainer" parent="Window/Margin/Root/Body/Showcase"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 16
+
+[node name="Hint" type="Label" parent="Window/Margin/Root/Body/Showcase/Footer"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="ResetButton" type="Button" parent="Window/Margin/Root/Body/Showcase/Footer"]
+layout_mode = 2
+
+[node name="Side" type="PanelContainer" parent="Window/Margin/Root/Body"]
+custom_minimum_size = Vector2(400, 0)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="SideScroll" type="ScrollContainer" parent="Window/Margin/Root/Body/Side"]
+layout_mode = 2
+horizontal_scroll_mode = 0
+
+[node name="Passport" type="VBoxContainer" parent="Window/Margin/Root/Body/Side/SideScroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+theme_override_constants/separation = 14
+
+[node name="SideLabel" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="Plate" type="Control" parent="Window/Margin/Root/Body/Side/SideScroll/Passport"]
+custom_minimum_size = Vector2(340, 438)
+layout_mode = 2
+size_flags_horizontal = 4
+mouse_filter = 2
+
+[node name="PlateBg" type="Panel" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@@ -89,71 +185,220 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
-color = Color(0, 0, 0, 0.9)
-[node name="ExpandedFrameImg" type="TextureRect" parent="ExpandedOverlay"]
+[node name="PlateArt" type="PanelContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate"]
layout_mode = 1
anchors_preset = -1
-anchor_left = 0.1
-anchor_top = 0.1
-anchor_right = 0.9
-anchor_bottom = 0.9
+anchor_left = 0.03
+anchor_top = 0.03
+anchor_right = 0.97
+anchor_bottom = 0.68
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
-expand_mode = 3
-stretch_mode = 5
-[node name="ExpandedImage" type="TextureRect" parent="ExpandedOverlay"]
+[node name="PlateImage" type="TextureRect" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate/PlateArt"]
layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.15
-anchor_top = 0.15
-anchor_right = 0.85
-anchor_bottom = 0.85
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 2
-expand_mode = 2
-stretch_mode = 5
-
-[node name="ExpandedName" type="Label" parent="ExpandedOverlay"]
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.15
+anchors_preset = 15
+anchor_right = 1.0
anchor_bottom = 1.0
-offset_top = -40.0
-offset_right = -20.0
-offset_bottom = -14.0
grow_horizontal = 2
-theme_override_font_sizes/font_size = 20
-text = ""
+grow_vertical = 2
+mouse_filter = 2
+expand_mode = 1
+stretch_mode = 6
+
+[node name="PlateGems" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.97
+anchor_right = 0.97
+offset_left = -64.0
+offset_top = 14.0
+offset_right = -8.0
+offset_bottom = 32.0
+grow_horizontal = 0
+mouse_filter = 2
+horizontal_alignment = 2
+
+[node name="PlateMedal" type="PanelContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -17.0
+offset_top = -17.0
+offset_right = 17.0
+offset_bottom = 17.0
+grow_horizontal = 2
+mouse_filter = 2
+
+[node name="MedalGlyph" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate/PlateMedal"]
+layout_mode = 2
+mouse_filter = 2
+text = "◆"
horizontal_alignment = 1
vertical_alignment = 1
-[node name="DescriptionBg" type="ColorRect" parent="ExpandedOverlay"]
+[node name="PlateNameBox" type="PanelContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate"]
layout_mode = 1
anchors_preset = -1
-anchor_top = 0.75
-anchor_right = 0.35
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 1
-color = Color(0.05, 0.05, 0.1, 0.85)
-
-[node name="DescriptionLabel" type="RichTextLabel" parent="ExpandedOverlay/DescriptionBg"]
-layout_mode = 1
-anchors_preset = -1
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_left = 12.0
-offset_top = 12.0
-offset_right = -12.0
-offset_bottom = -12.0
+anchor_left = 0.14
+anchor_top = 0.8
+anchor_right = 0.86
+anchor_bottom = 0.93
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
-bbcode_enabled = true
-fit_content = true
-scroll_active = false
+
+[node name="PlateName" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Plate/PlateNameBox"]
+layout_mode = 2
+mouse_filter = 2
+horizontal_alignment = 1
+vertical_alignment = 1
+autowrap_mode = 3
+
+[node name="Badges" type="HFlowContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/h_separation = 6
+theme_override_constants/v_separation = 6
+
+[node name="Desc" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport"]
+layout_mode = 2
+mouse_filter = 2
+autowrap_mode = 3
+
+[node name="Chips" type="HFlowContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/h_separation = 5
+theme_override_constants/v_separation = 5
+
+[node name="Grant" type="PanelContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport"]
+visible = false
+layout_mode = 2
+mouse_filter = 2
+
+[node name="GrantRow" type="HBoxContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Grant"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 10
+
+[node name="GrantIcon" type="TextureRect" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Grant/GrantRow"]
+custom_minimum_size = Vector2(44, 44)
+layout_mode = 2
+size_flags_vertical = 4
+mouse_filter = 2
+expand_mode = 1
+stretch_mode = 5
+
+[node name="GrantInfo" type="VBoxContainer" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Grant/GrantRow"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 4
+mouse_filter = 2
+theme_override_constants/separation = 2
+
+[node name="GrantCaption" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Grant/GrantRow/GrantInfo"]
+layout_mode = 2
+mouse_filter = 2
+autowrap_mode = 3
+
+[node name="GrantName" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport/Grant/GrantRow/GrantInfo"]
+layout_mode = 2
+mouse_filter = 2
+autowrap_mode = 3
+
+[node name="Empty" type="Label" parent="Window/Margin/Root/Body/Side/SideScroll/Passport"]
+visible = false
+layout_mode = 2
+mouse_filter = 2
+horizontal_alignment = 1
+autowrap_mode = 3
+
+[node name="Hud" type="Panel" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -458.0
+offset_top = -232.0
+offset_right = -32.0
+offset_bottom = -22.0
+grow_horizontal = 0
+grow_vertical = 0
+
+[node name="HudAccent" type="Panel" parent="Hud"]
+layout_mode = 1
+anchors_preset = -1
+anchor_bottom = 1.0
+offset_right = 2.0
+grow_vertical = 2
+mouse_filter = 2
+
+[node name="HudMargin" type="MarginContainer" parent="Hud"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 15
+theme_override_constants/margin_top = 13
+theme_override_constants/margin_right = 15
+theme_override_constants/margin_bottom = 12
+
+[node name="HudColumn" type="VBoxContainer" parent="Hud/HudMargin"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="HudHead" type="HBoxContainer" parent="Hud/HudMargin/HudColumn"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 10
+
+[node name="HudTitle" type="Label" parent="Hud/HudMargin/HudColumn/HudHead"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="HudSpacer" type="Control" parent="Hud/HudMargin/HudColumn/HudHead"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+
+[node name="HudCount" type="Label" parent="Hud/HudMargin/HudColumn/HudHead"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="HudRule" type="Panel" parent="Hud/HudMargin/HudColumn"]
+custom_minimum_size = Vector2(0, 1)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="HudScroll" type="ScrollContainer" parent="Hud/HudMargin/HudColumn"]
+custom_minimum_size = Vector2(0, 96)
+layout_mode = 2
+horizontal_scroll_mode = 0
+
+[node name="HudList" type="GridContainer" parent="Hud/HudMargin/HudColumn/HudScroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+theme_override_constants/h_separation = 20
+theme_override_constants/v_separation = 4
+columns = 2
+
+[node name="HudEmpty" type="Label" parent="Hud/HudMargin/HudColumn"]
+visible = false
+layout_mode = 2
+mouse_filter = 2
+autowrap_mode = 3
+
+[node name="HudFoot" type="Label" parent="Hud/HudMargin/HudColumn"]
+layout_mode = 2
+mouse_filter = 2
+autowrap_mode = 3
diff --git a/src/EnslaveCondition.cs b/src/EnslaveCondition.cs
deleted file mode 100644
index cdb4c57..0000000
--- a/src/EnslaveCondition.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using Cthangover.Core.Characters;
-using Cthangover.Core.Relationship;
-using Cthangover.Core.Settings;
-
-namespace Cthangover.Core.Relationship
-{
- ///
- /// Recruitment condition that gates the "enslave" recruit option
- /// behind the slave_master skill. When the player attempts to
- /// recruit an NPC, the recruitment system queries all registered
- /// implementations; if this condition
- /// is present and the player does not have the skill, the enslavement
- /// option is hidden or disabled.
- ///
- public class EnslaveCondition : IRecruitCondition
- {
- ///
- /// Identifies this condition as the enslavement gate for the
- /// recruitment system (maps to enslave option).
- ///
- public string Id => "enslave";
-
- ///
- /// Determines whether enslavement is available for the given enemy.
- /// Checks the runtime skill data for the slave_master skill.
- /// The target is provided but not inspected
- /// because the condition depends solely on the player's skills.
- ///
- public bool CanRecruit(Character enemy, RuntimeData runtime)
- {
- return runtime.SkillData.HasSkill("slave_master");
- }
- }
-}
diff --git a/src/StarterPartyInitializer.cs b/src/StarterPartyInitializer.cs
deleted file mode 100644
index c84ad08..0000000
--- a/src/StarterPartyInitializer.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using Cthangover.Core.Events;
-using Cthangover.Core.Mods;
-using Cthangover.Core.Settings;
-
-namespace Cthangover.Core.Characters
-{
- ///
- /// Populates the initial player party with the default starter
- /// character "Marao" when the core mod finishes loading.
- ///
- /// The party can only be populated during OnModResourcesReady,
- /// not earlier. OnModLoaded and the constructor fire inside
- /// ModRegistry.Initialize → ModCompiler.LoadModCode,
- /// where mod JSON resources are not yet guaranteed to be accessible.
- /// AddCharacterToParty chains into CharacterFactory.Get,
- /// which calls ModManager.CollectJsonGroup — this requires
- /// file providers to be fully set up, which only happens after the
- /// entire ModRegistry.Initialize pipeline completes.
- ///
- /// OnModResourcesReady is invoked by ModInitializerRegistry
- /// .NotifyResourcesReady at the end of SceneManager.Initialize,
- /// after ModRegistry finishes discovery, SceneEventRegistry
- /// is primed, and scene definitions are collected. At that point all
- /// factories can safely read mod JSON data.
- ///
- /// Mods that introduce additional starter characters should implement
- /// their own IModInitializer and call AddCharacterToParty
- /// from OnModResourcesReady for their character IDs.
- ///
- public class StarterPartyInitializer : IModInitializer
- {
- private static bool newGameHookInstalled;
-
- ///
- /// No-op: cross-mod lifecycle notifications are not needed for
- /// starter party setup. Each mod's OnModResourcesReady
- /// handles its own default characters independently.
- ///
- public void OnModLoaded(string modId) { }
-
- ///
- /// Adds the core mod's default starter character "Marao"
- /// to both Characters and BattleSet via
- /// CharacterData.AddCharacterToParty. Called once, after
- /// all mod file providers and JSON resources are guaranteed to
- /// be accessible. Also installs the one-time
- /// hook so the starter party is
- /// restored after ResetRuntime wipes it at the start of a
- /// new game. Both operations are idempotent.
- ///
- public void OnModResourcesReady()
- {
- SeedStarterParty();
-
- if (newGameHookInstalled)
- return;
-
- newGameHookInstalled = true;
- ModEventBus.Subscribe(_ => SeedStarterParty());
- }
-
- private static void SeedStarterParty()
- {
- GameData.Instance.Runtime.CharacterData.AddCharacterToParty("Marao");
- GameData.Instance.Runtime.SkillData.AddSkill("slave_master");
- }
- }
-}
diff --git a/status_effects/status_effects.json b/status_effects/status_effects.json
deleted file mode 100644
index deacc5a..0000000
Binary files a/status_effects/status_effects.json and /dev/null differ