From 58276c765ad81e949f0dec3a9002f77e7706457c Mon Sep 17 00:00:00 2001
From: Oskar Marquardt <oskar.marquardt@student.uni-halle.de>
Date: Tue, 18 Jun 2024 15:34:06 +0200
Subject: [PATCH] Added arete - Added remaining spheres - Forced sphere dots to
 be at most at arete level - Moved creationpoints into dedicated module -
 Temporarily removed ability to use freebie points

---
 public/main.js    |  61 ++++++++++++---------------
 src/Character.elm | 102 ++++++++++++++++------------------------------
 src/Creation.elm  |  25 ++++++++++++
 src/Sphere.elm    |   7 ++--
 4 files changed, 89 insertions(+), 106 deletions(-)
 create mode 100644 src/Creation.elm

diff --git a/public/main.js b/public/main.js
index e52c120..047f4a9 100644
--- a/public/main.js
+++ b/public/main.js
@@ -5166,9 +5166,10 @@ var $author$project$BoundedInt$new = F3(
 var $author$project$Sphere$dots = function (value) {
 	return A3($author$project$BoundedInt$new, value, 0, 5);
 };
+var $author$project$Creation$new = {freebie: 15, spheres: 6};
 var $author$project$Character$new = {
 	arete: A3($author$project$BoundedInt$new, 1, 0, 10),
-	creationPoints: {freebie: 15, spheres: 6},
+	creationPoints: $author$project$Creation$new,
 	name: 'Default Name',
 	spheres: _List_fromArray(
 		[
@@ -5237,15 +5238,25 @@ var $author$project$Character$changeName = F2(
 			character,
 			{name: newName});
 	});
+var $author$project$Creation$buySphere = F2(
+	function (cp, value) {
+		return _Utils_update(
+			cp,
+			{spheres: cp.spheres - value});
+	});
 var $author$project$BoundedInt$changeTo = F2(
 	function (boundedInt, value) {
 		return ((_Utils_cmp(value, boundedInt.min) < 0) || (_Utils_cmp(value, boundedInt.max) > 0)) ? boundedInt : _Utils_update(
 			boundedInt,
 			{value: value});
 	});
-var $author$project$BoundedInt$changeBy = F2(
-	function (boundedInt, value) {
-		return A2($author$project$BoundedInt$changeTo, boundedInt, boundedInt.value + value);
+var $author$project$Sphere$changeDotsOfSphereTo = F2(
+	function (sphere, value) {
+		return _Utils_update(
+			sphere,
+			{
+				dots: A2($author$project$BoundedInt$changeTo, sphere.dots, value)
+			});
 	});
 var $author$project$Sphere$isSphere = F2(
 	function (name, sphere) {
@@ -5262,8 +5273,6 @@ var $author$project$Sphere$changeSphereInList = F2(
 			$author$project$Sphere$changeSphere(sphere),
 			spheres);
 	});
-var $author$project$Sphere$freebieCost = 7;
-var $elm$core$Basics$ge = _Utils_ge;
 var $elm$core$List$filter = F2(
 	function (isGood, list) {
 		return A3(
@@ -5302,9 +5311,6 @@ var $elm$core$Basics$min = F2(
 	function (x, y) {
 		return (_Utils_cmp(x, y) < 0) ? x : y;
 	});
-var $elm$core$Basics$negate = function (n) {
-	return -n;
-};
 var $author$project$Character$changeSphere = F2(
 	function (character, sphere) {
 		var maybeOldDots = A2($author$project$Sphere$getDotsOfSphereInList, character.spheres, sphere.name);
@@ -5313,38 +5319,23 @@ var $author$project$Character$changeSphere = F2(
 				return 0;
 			} else {
 				var oldDots = maybeOldDots.a;
-				return (_Utils_cmp(sphere.dots.value, character.arete.value) > 0) ? character.arete.value : (sphere.dots.value - oldDots.value);
+				return (_Utils_cmp(sphere.dots.value, character.arete.value) > 0) ? (character.arete.value - oldDots.value) : (sphere.dots.value - oldDots.value);
 			}
 		}();
 		if (maybeOldDots.$ === 'Nothing') {
 			return character;
 		} else {
 			var oldDots = maybeOldDots.a;
-			if (difference >= 0) {
-				var sA = (character.creationPoints.spheres > 0) ? A2($elm$core$Basics$min, difference, character.creationPoints.spheres) : 0;
-				var fA = A2($elm$core$Basics$min, difference - sA, (character.creationPoints.freebie / $author$project$Sphere$freebieCost) | 0);
-				return _Utils_update(
-					character,
-					{
-						creationPoints: {freebie: character.creationPoints.freebie - (fA * $author$project$Sphere$freebieCost), spheres: (character.creationPoints.spheres - sA) - fA},
-						spheres: A2(
-							$author$project$Sphere$changeSphereInList,
-							character.spheres,
-							_Utils_update(
-								sphere,
-								{
-									dots: A2($author$project$BoundedInt$changeBy, oldDots, fA + sA)
-								}))
-					});
-			} else {
-				var fA = (character.creationPoints.spheres < 0) ? (-A2($elm$core$Basics$max, difference, character.creationPoints.spheres)) : 0;
-				return _Utils_update(
-					character,
-					{
-						creationPoints: {freebie: character.creationPoints.freebie + (fA * $author$project$Sphere$freebieCost), spheres: character.creationPoints.spheres - difference},
-						spheres: A2($author$project$Sphere$changeSphereInList, character.spheres, sphere)
-					});
-			}
+			var buyAmount = A2($elm$core$Basics$min, difference, character.creationPoints.spheres);
+			return _Utils_update(
+				character,
+				{
+					creationPoints: A2($author$project$Creation$buySphere, character.creationPoints, buyAmount),
+					spheres: A2(
+						$author$project$Sphere$changeSphereInList,
+						character.spheres,
+						A2($author$project$Sphere$changeDotsOfSphereTo, sphere, oldDots.value + buyAmount))
+				});
 		}
 	});
 var $author$project$Main$modalValue = F2(
diff --git a/src/Character.elm b/src/Character.elm
index 849a3db..d1a0aee 100644
--- a/src/Character.elm
+++ b/src/Character.elm
@@ -1,8 +1,8 @@
 module Character exposing (..)
 
 import Sphere exposing (Sphere)
-import Sphere exposing (getDotsOfSphereInList)
 import BoundedInt exposing (BoundedInt)
+import Creation exposing (CreationPoints)
 
 type alias Character =
     { name : String
@@ -11,74 +11,10 @@ type alias Character =
     , arete : BoundedInt
     }
 
-type alias CreationPoints =
-    { freebie : Int
-    , spheres : Int
-    }
-
-changeName : Character -> String -> Character
-changeName character newName =
-    if ( newName == "")
-    then
-        character
-    else
-        { character | name = newName }
-
-changeSphere : Character -> Sphere -> Character
-changeSphere character sphere =
-    let
-        maybeOldDots = getDotsOfSphereInList character.spheres sphere.name
-        difference = case maybeOldDots of
-            Nothing -> 0
-            Just oldDots ->
-                if sphere.dots.value > character.arete.value
-                then character.arete.value
-                else sphere.dots.value - oldDots.value
-    in
-        case maybeOldDots of
-            Nothing -> character
-            Just oldDots ->
-                if difference >= 0
-                then
-                    let
-                        sA = 
-                            if character.creationPoints.spheres > 0
-                                then min difference character.creationPoints.spheres
-                                else 0
-                        fA = min ( difference - sA ) ( character.creationPoints.freebie // Sphere.freebieCost )
-                    in
-                        { character
-                        | spheres = Sphere.changeSphereInList character.spheres 
-                            { sphere 
-                            | dots = BoundedInt.changeBy oldDots ( fA + sA )
-                            } 
-                        , creationPoints =
-                            { freebie = character.creationPoints.freebie - fA * Sphere.freebieCost
-                            , spheres = character.creationPoints.spheres - sA - fA
-                            }
-                        }
-                else
-                    let
-                        fA =
-                            if character.creationPoints.spheres < 0
-                            then negate ( max difference character.creationPoints.spheres )
-                            else 0
-                    in
-                        { character
-                        | spheres = Sphere.changeSphereInList character.spheres sphere
-                        , creationPoints =
-                            { freebie = character.creationPoints.freebie + fA * Sphere.freebieCost
-                            , spheres = character.creationPoints.spheres - difference
-                            }
-                        }
-
 new : Character
 new =
-    { name = "Default Name" 
-    , creationPoints =
-        { freebie = 15
-        , spheres = 6
-        }
+    { name = "Default Name"
+    , creationPoints = Creation.new
     , spheres = 
         [   { name = "Correspondence"
             , dots = Sphere.dots 0
@@ -118,4 +54,34 @@ new =
             }
         ]
     , arete = BoundedInt.new 1 0 10
-    }
\ No newline at end of file
+    }
+
+changeName : Character -> String -> Character
+changeName character newName =
+    if ( newName == "")
+    then
+        character
+    else
+        { character | name = newName }
+
+changeSphere : Character -> Sphere -> Character
+changeSphere character sphere =
+    let
+        maybeOldDots = Sphere.getDotsOfSphereInList character.spheres sphere.name
+        difference = case maybeOldDots of
+            Nothing -> 0
+            Just oldDots ->
+                if sphere.dots.value > character.arete.value
+                then character.arete.value - oldDots.value
+                else sphere.dots.value - oldDots.value
+    in
+        case maybeOldDots of
+            Nothing -> character
+            Just oldDots ->
+                let
+                    buyAmount = min difference character.creationPoints.spheres
+                in
+                    { character
+                    | creationPoints = Creation.buySphere character.creationPoints buyAmount
+                    , spheres = Sphere.changeSphereInList character.spheres ( Sphere.changeDotsOfSphereTo sphere ( oldDots.value + buyAmount ) )
+                    }
\ No newline at end of file
diff --git a/src/Creation.elm b/src/Creation.elm
new file mode 100644
index 0000000..96288f3
--- /dev/null
+++ b/src/Creation.elm
@@ -0,0 +1,25 @@
+module Creation exposing (..)
+
+import Sphere exposing (Sphere)
+
+type alias CreationPoints =
+    { freebie : Int
+    , spheres : Int
+    }
+
+new : CreationPoints 
+new =
+    { freebie = 15
+    , spheres = 6
+    }
+
+cost :
+    { sphere : Int
+    }
+cost = 
+    { sphere = 7
+    }
+
+buySphere : CreationPoints -> Int -> CreationPoints
+buySphere cp value =
+    { cp | spheres = cp.spheres - value }
diff --git a/src/Sphere.elm b/src/Sphere.elm
index 1e551f0..eb57757 100644
--- a/src/Sphere.elm
+++ b/src/Sphere.elm
@@ -8,9 +8,6 @@ type alias Sphere =
     , affinity : Bool
     }
 
-freebieCost : Int
-freebieCost = 7
-
 changeSphereInList : List Sphere -> Sphere -> List Sphere
 changeSphereInList spheres sphere =
     List.map ( changeSphere sphere ) spheres
@@ -23,6 +20,10 @@ changeSphere newSphere sphere =
     else
         sphere
 
+changeDotsOfSphereTo : Sphere -> Int -> Sphere
+changeDotsOfSphereTo sphere value =
+    { sphere | dots = BoundedInt.changeTo sphere.dots value }
+
 isSphere : String -> Sphere -> Bool
 isSphere name sphere =
     sphere.name == name
-- 
GitLab