diff --git a/GildedRoseRequirements_ar.md b/GildedRoseRequirements_ar.md
new file mode 100644
index 00000000..70c7a253
--- /dev/null
+++ b/GildedRoseRequirements_ar.md
@@ -0,0 +1,30 @@
+# مواصفات متطلبات Gilded Rose
+
+مرحبًا بكم في فريق Gilded Rose. كما تعلمون، نحن نُدير نزلاً صغيرًا بموقع مميز في مدينة بارزة يديره صاحب نزل ودود يُدعى Allison. نحن نشتري ونبيع فقط أرقى البضائع.
+لسوء الحظ، بضائعنا تتدهور في (Quality) القيمة مع اقتراب تاريخ بيعها.
+
+لدينا نظام يقوم بتحديث المخزون لدينا. تم تطويره بواسطة شخص عملي يُدعى Leeroy، الذي انتقل الآن إلى مغامرات جديدة.
+مهمتك هي إضافة ميزة جديدة إلى نظامنا لكي نبدأ ببيع فئة جديدة من العناصر. أولاً، مقدمة عن نظامنا:
+
+- جميع (Items) العناصر لها قيمة (SellIn) تاريخ البيع، والذي يشير إلى عدد الأيام المتبقية لبيع (Items) العناصر.
+- جميع (Items) العناصر لها (Quality) القيمة، والتي تدل على مدى قيمة العنصر.
+- في نهاية كل يوم، يقوم نظامنا بتقليل القيمتين لكل عنصر.
+
+بسيط، أليس كذلك؟ حسنًا، هنا تصبح الأمور مثيرة:
+
+- بمجرد أن يمر تاريخ البيع، تتدهور (Quality) القيمة بمعدل مضاعف.
+- لا يمكن أن تكون قيمة (Quality) سالبة أبدًا.
+- __"Aged Brie"__ تزداد (Quality) القيمة الخاصة به مع تقدم عمره.
+- لا يمكن أن تتجاوز (Quality) القيمة أكثر من `50`.
+- __"Sulfuras"__، كونه عنصرًا أسطوريًا، لا يحتاج أبدًا إلى البيع ولا تتناقص (Quality) القيمة الخاصة به.
+- __"Backstage passes"__، مثل Aged Brie، تزداد (Quality) القيمة الخاصة به مع اقتراب موعد البيع:
+ - تزداد (Quality) القيمة بمقدار `2` عندما يتبقى `10` أيام أو أقل، وبمقدار `3` عندما يتبقى `5` أيام أو أقل.
+ - ولكن، تنخفض (Quality) القيمة إلى `0` بعد انتهاء الحفل.
+
+لقد وقعنا مؤخرًا عقدًا مع مورد لعناصر __"Conjured"__. هذا يتطلب تحديثًا لنظامنا:
+
+- عناصر __"Conjured"__ تتدهور (Quality) القيمة الخاصة بها بمعدل أسرع مرتين من العناصر العادية.
+
+يمكنك إجراء أي تغييرات على دالة `UpdateQuality` وإضافة أي كود جديد طالما أن كل شيء لا يزال يعمل بشكل صحيح. ومع ذلك، لا تقم بتعديل فئة `Item` أو خاصية (Items) العناصر، لأن الغول الجالس في الزاوية سيغضب بشدة وقد يقضي عليك في لحظة، فهو لا يؤمن بمشاركة ملكية الكود (يمكنك جعل `UpdateQuality` و (Items) العناصر ساكنين static إذا أردت، وسنتكفل نحن بالتغطية عليك).
+
+للتوضيح فقط، لا يمكن لـ (Quality) القيمة لأي عنصر أن تزيد عن `50`، باستثناء __"Sulfuras"__، حيث أن (Quality) القيمة الخاصة به تساوي `80` ولا تتغير أبدًا.
diff --git a/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj b/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj
index f26f9caa..02787bbe 100644
--- a/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj
+++ b/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj
@@ -1,7 +1,7 @@
- net6.0
+ net9.0
false
@@ -14,9 +14,9 @@
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers
@@ -27,7 +27,7 @@
-
+
diff --git a/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj b/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj
index 9617805b..53f7981f 100644
--- a/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj
+++ b/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj
@@ -1,7 +1,7 @@
- net6.0
+ net9.0
false
@@ -11,10 +11,10 @@
-
-
-
-
+
+
+
+
all
runtime; build; native; contentfiles; analyzers
@@ -25,7 +25,7 @@
-
+
diff --git a/fsharp-core/GildedRose/GildedRose.fsproj b/fsharp-core/GildedRose/GildedRose.fsproj
index f3235211..6a5e7449 100644
--- a/fsharp-core/GildedRose/GildedRose.fsproj
+++ b/fsharp-core/GildedRose/GildedRose.fsproj
@@ -2,7 +2,7 @@
Exe
- net6.0
+ net9.0
@@ -10,7 +10,7 @@
-
+
diff --git a/odin/.gitignore b/odin/.gitignore
new file mode 100644
index 00000000..2f0031b3
--- /dev/null
+++ b/odin/.gitignore
@@ -0,0 +1,3 @@
+*.o
+*.bin
+*.exe
diff --git a/odin/README.md b/odin/README.md
new file mode 100644
index 00000000..af878cfc
--- /dev/null
+++ b/odin/README.md
@@ -0,0 +1,34 @@
+# Gilded Rose starting position in Odin
+
+Learn how to install Odin on your system [here](https://odin-lang.org/docs/install/)
+
+## Run unit tests from the command line
+```
+$ odin test tests
+```
+## Run the TextTest fixture on the command line
+Build the executable:
+
+```
+$ odin build src -out:gilded_rose
+```
+
+Execute it on the command line with an argument for the number of days:
+
+### macOS:
+
+```
+$ ./gilded_rose.bin 10
+```
+### Windows:
+
+```
+$ ./gilded_rose.exe 10
+```
+
+## Run the TextTest approval test that comes with this project
+There are instructions in the TextTest Readme for setting up TextTest. You will need to specify the executable in `config.gr`. Uncomment this line to use it:
+
+```
+#executable:${TEXTTEST_HOME}/odin/gilded_rose
+```
diff --git a/odin/src/core/gilded_rose.odin b/odin/src/core/gilded_rose.odin
new file mode 100644
index 00000000..35ce6cfc
--- /dev/null
+++ b/odin/src/core/gilded_rose.odin
@@ -0,0 +1,55 @@
+package gilded_rose
+
+Item :: struct {
+ name: string,
+ sell_in: i32,
+ quality: i32,
+}
+
+update_quality :: proc(inventory: []Item) {
+ for &item in inventory {
+ if item.name != "Aged Brie" && item.name != "Backstage passes to a TAFKAL80ETC concert" {
+ if item.quality > 0 {
+ if item.name != "Sulfuras, Hand of Ragnaros" {
+ item.quality = item.quality - 1
+ }
+ }
+ } else {
+ if item.quality < 50 {
+ item.quality = item.quality + 1
+ if item.name == "Backstage passes to a TAFKAL80ETC concert" {
+ if item.sell_in < 11 {
+ if item.quality < 50 {
+ item.quality = item.quality + 1
+ }
+ }
+ if item.sell_in < 6 {
+ if item.quality < 50 {
+ item.quality = item.quality + 1
+ }
+ }
+ }
+ }
+ }
+ if item.name != "Sulfuras, Hand of Ragnaros" {
+ item.sell_in = item.sell_in - 1
+ }
+ if item.sell_in < 0 {
+ if item.name != "Aged Brie" {
+ if item.name != "Backstage passes to a TAFKAL80ETC concert" {
+ if item.quality > 0 {
+ if item.name != "Sulfuras, Hand of Ragnaros" {
+ item.quality = item.quality - 1
+ }
+ }
+ } else {
+ item.quality = item.quality - item.quality
+ }
+ } else {
+ if item.quality < 50 {
+ item.quality = item.quality + 1
+ }
+ }
+ }
+ }
+}
diff --git a/odin/src/main.odin b/odin/src/main.odin
new file mode 100644
index 00000000..904f5b1d
--- /dev/null
+++ b/odin/src/main.odin
@@ -0,0 +1,46 @@
+package main
+
+import GildedRose "./core"
+import "core:fmt"
+import "core:os"
+import "core:slice"
+import "core:strconv"
+
+main :: proc() {
+ days := 2
+ if num_of_days, arg_ok := slice.get(os.args, 1); arg_ok {
+ if val, ok := strconv.parse_int(num_of_days); ok && val > 0 {
+ days = val
+ } else {
+ fmt.eprintf("Please enter a number greater than 0\n")
+ return
+ }
+ }
+
+ items := []GildedRose.Item {
+ {"+5 Dexterity Vest", 10, 20},
+ {"Aged Brie", 2, 0},
+ {"Elixir of the Mongoose", 5, 7},
+ {"Sulfuras, Hand of Ragnaros", 0, 80},
+ {"Sulfuras, Hand of Ragnaros", -1, 80},
+ {"Backstage passes to a TAFKAL80ETC concert", 15, 20},
+ {"Backstage passes to a TAFKAL80ETC concert", 10, 49},
+ {"Backstage passes to a TAFKAL80ETC concert", 5, 49},
+ // This Conjured item does not work properly yet
+ {"Conjured Mana Cake", 3, 6},
+ }
+
+ fmt.println("OMGHAI!")
+
+ for day in 0 ..= days {
+ day_line := fmt.tprint("-------- day", day, "--------")
+ fmt.println(day_line)
+ fmt.println("name, sellIn, quality")
+ for item in items {
+ item_line := fmt.tprint(item.name, item.sell_in, item.quality, sep = ", ")
+ fmt.println(item_line)
+ }
+ fmt.println()
+ GildedRose.update_quality(items)
+ }
+}
diff --git a/odin/tests/gilded_rose_test.odin b/odin/tests/gilded_rose_test.odin
new file mode 100644
index 00000000..c24ff7dd
--- /dev/null
+++ b/odin/tests/gilded_rose_test.odin
@@ -0,0 +1,11 @@
+package test_gilded_rose
+
+import GildedRose "../src/core"
+import "core:testing"
+
+@(test)
+update_quality_test :: proc(t: ^testing.T) {
+ items := []GildedRose.Item{{"food", 0, 0}}
+ GildedRose.update_quality(items)
+ testing.expect(t, "fixme" == items[0].name, "Fix this test")
+}
diff --git a/texttests/config.gr b/texttests/config.gr
index b7166cd0..9c707ffc 100755
--- a/texttests/config.gr
+++ b/texttests/config.gr
@@ -64,4 +64,7 @@ interpreter:ruby
# Settings for the OCaml version
# executable:${TEXTTEST_HOME}/ocaml/_build/default/bin/main.exe
+# Settings for the Odin version
+#executable:${TEXTTEST_HOME}/odin/gilded_rose
+
filename_convention_scheme:standard