From 8e33838cc386fd0048cfecec97786327310f9dd8 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 6 Apr 2024 21:38:11 -0300 Subject: [PATCH 01/36] EST Added initial packages and first tests --- src/test/scala/unit/CharacterTest.scala | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/test/scala/unit/CharacterTest.scala diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala new file mode 100644 index 0000000..06217d0 --- /dev/null +++ b/src/test/scala/unit/CharacterTest.scala @@ -0,0 +1,23 @@ +package unit + +class CharacterTest extends munit.FunSuite { + var trainer: Character = _ + var magictrainer: Character = _ + + override def beforeEach(context: BeforeEach): Unit = { + trainer = new Character("TrainerOne",100,50,32.5,"Paladin") + magictrainer = new Character("TrainerTwo",20,5,25,"BlackMage",1000) + } + test("Character constructor checks"){ + assertEquals(trainer.name,"TrainerOne") + assertEquals(trainer.life,100) + assertEquals(trainer.defense,50) + assertEquals(trainer.weight,32.5) + assertEquals(trainer.profession,"Paladin") + assertEquals(magictrainer.name,"TrainerTwo") + assertEquals(magictrainer.life,20) + assertEquals(magictrainer.defense,5) + assertEquals(magictrainer.weight,25) + assertEquals(magictrainer.profession,"BlackMage",1000) + } +} From a82eb0574aa1e0bef67033a45c9f4c09e562dc88 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 6 Apr 2024 21:44:53 -0300 Subject: [PATCH 02/36] FIX Corrected magictrainer mana test --- src/test/scala/unit/CharacterTest.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index 06217d0..6778649 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -18,6 +18,7 @@ class CharacterTest extends munit.FunSuite { assertEquals(magictrainer.life,20) assertEquals(magictrainer.defense,5) assertEquals(magictrainer.weight,25) - assertEquals(magictrainer.profession,"BlackMage",1000) + assertEquals(magictrainer.profession,"BlackMage") + assertEquals(magictrainer.mana,1000) } } From 3afe36bce0f5f5c2855c0311a3616e55daadaaa2 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 6 Apr 2024 21:59:30 -0300 Subject: [PATCH 03/36] FEAT Added Unit trait and AbstractCharacter abstract class --- src/main/scala/unit/AbstractCharacter.scala | 5 +++++ src/main/scala/unit/Unit.scala | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 src/main/scala/unit/AbstractCharacter.scala create mode 100644 src/main/scala/unit/Unit.scala diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala new file mode 100644 index 0000000..ca7194e --- /dev/null +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -0,0 +1,5 @@ +package unit + +abstract class AbstractCharacter extends Unit { + +} diff --git a/src/main/scala/unit/Unit.scala b/src/main/scala/unit/Unit.scala new file mode 100644 index 0000000..118f0d1 --- /dev/null +++ b/src/main/scala/unit/Unit.scala @@ -0,0 +1,8 @@ +package unit + +trait Unit { + val name: String + var life: Int + var defense: Int + val weight: Float +} From 2ff14a78eccd89368d1c07abb05333ec9564723c Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 6 Apr 2024 22:16:32 -0300 Subject: [PATCH 04/36] FEAT Added Character Class and fixed typos --- src/main/scala/unit/AbstractCharacter.scala | 2 +- src/main/scala/unit/Character.scala | 5 +++++ src/main/scala/unit/Unit.scala | 2 +- src/test/scala/unit/CharacterTest.scala | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 src/main/scala/unit/Character.scala diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index ca7194e..8d9ed21 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -1,5 +1,5 @@ package unit abstract class AbstractCharacter extends Unit { - + var heldweapon: Weapon = _ } diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala new file mode 100644 index 0000000..c6a697b --- /dev/null +++ b/src/main/scala/unit/Character.scala @@ -0,0 +1,5 @@ +package unit + +class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String) extends AbstractCharacter { + +} diff --git a/src/main/scala/unit/Unit.scala b/src/main/scala/unit/Unit.scala index 118f0d1..5f3b75b 100644 --- a/src/main/scala/unit/Unit.scala +++ b/src/main/scala/unit/Unit.scala @@ -4,5 +4,5 @@ trait Unit { val name: String var life: Int var defense: Int - val weight: Float + val weight: Double } diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index 6778649..e422e09 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -6,7 +6,7 @@ class CharacterTest extends munit.FunSuite { override def beforeEach(context: BeforeEach): Unit = { trainer = new Character("TrainerOne",100,50,32.5,"Paladin") - magictrainer = new Character("TrainerTwo",20,5,25,"BlackMage",1000) + magictrainer = new Character("TrainerTwo",20,5,25.0,"BlackMage",1000) } test("Character constructor checks"){ assertEquals(trainer.name,"TrainerOne") @@ -17,7 +17,7 @@ class CharacterTest extends munit.FunSuite { assertEquals(magictrainer.name,"TrainerTwo") assertEquals(magictrainer.life,20) assertEquals(magictrainer.defense,5) - assertEquals(magictrainer.weight,25) + assertEquals(magictrainer.weight,25.0) assertEquals(magictrainer.profession,"BlackMage") assertEquals(magictrainer.mana,1000) } From cf11a5efa830697466178b095007bc0649de7716 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 6 Apr 2024 23:01:25 -0300 Subject: [PATCH 05/36] FEAT Added auxiliary constructors for Character class and refactored Unit to Units to avoid confusion --- src/main/scala/unit/AbstractCharacter.scala | 2 +- src/main/scala/unit/Character.scala | 22 +++++++++++++++++-- .../scala/unit/{Unit.scala => Units.scala} | 2 +- src/test/scala/unit/CharacterTest.scala | 17 ++++++++++++-- 4 files changed, 37 insertions(+), 6 deletions(-) rename src/main/scala/unit/{Unit.scala => Units.scala} (86%) diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 8d9ed21..4ffa3cb 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -1,5 +1,5 @@ package unit -abstract class AbstractCharacter extends Unit { +abstract class AbstractCharacter extends Units { var heldweapon: Weapon = _ } diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index c6a697b..fb96b50 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -1,5 +1,23 @@ package unit -class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String) extends AbstractCharacter { - +class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String, var mana:Int=0) extends AbstractCharacter { + def this(x: String, l: Int, w: Double, p: String) = { + this(x, l, defense, w, p) + } + + def this(x: String, l: Int, w: Int, p: String) = { + this(x, l, w.toDouble, p) + } + + def this(x: String, l: Int, d: Int, w: Int, p: String) = { + this(x, l, d, w.toDouble, p) + } + + def this(x: String, l: Int, w: Double, p: String, m: Int) = { + this(x, l, defense, w, p, m) + } + + def this(x: String, l: Int, w: Int, p: String, m: Int) = { + this(x, l, w.toDouble, p, m) + } } diff --git a/src/main/scala/unit/Unit.scala b/src/main/scala/unit/Units.scala similarity index 86% rename from src/main/scala/unit/Unit.scala rename to src/main/scala/unit/Units.scala index 5f3b75b..8744970 100644 --- a/src/main/scala/unit/Unit.scala +++ b/src/main/scala/unit/Units.scala @@ -1,6 +1,6 @@ package unit -trait Unit { +trait Units { val name: String var life: Int var defense: Int diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index e422e09..c67476f 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -3,10 +3,16 @@ package unit class CharacterTest extends munit.FunSuite { var trainer: Character = _ var magictrainer: Character = _ + var weakcharacter: Character = _ + var weakcharacter2: Character = _ + var weakcharacter3: Character = _ override def beforeEach(context: BeforeEach): Unit = { - trainer = new Character("TrainerOne",100,50,32.5,"Paladin") - magictrainer = new Character("TrainerTwo",20,5,25.0,"BlackMage",1000) + trainer = new Character("TrainerOne", 100, 50, 32.5, "Paladin") + magictrainer = new Character("TrainerTwo", 20, 5, 25, "BlackMage", 1000) + weakcharacter = new Character("TrainerOne", 100, 30, "Ninja") + weakcharacter2 = new Character("TrainerOne", 100, 32.5, "WhiteMage",1) + weakcharacter3 = new Character("TrainerOne", 100, 10, "WhiteMage",1) } test("Character constructor checks"){ assertEquals(trainer.name,"TrainerOne") @@ -14,11 +20,18 @@ class CharacterTest extends munit.FunSuite { assertEquals(trainer.defense,50) assertEquals(trainer.weight,32.5) assertEquals(trainer.profession,"Paladin") + assertEquals(trainer.mana,0) assertEquals(magictrainer.name,"TrainerTwo") assertEquals(magictrainer.life,20) assertEquals(magictrainer.defense,5) assertEquals(magictrainer.weight,25.0) assertEquals(magictrainer.profession,"BlackMage") assertEquals(magictrainer.mana,1000) + assertEquals(weakcharacter.weight,30.0) + assertEquals(weakcharacter.defense,0) + assertEquals(weakcharacter2.weight,32.5) + assertEquals(weakcharacter2.defense,0) + assertEquals(weakcharacter3.weight,10.0) + assertEquals(weakcharacter3.defense,0) } } From 1c796b5ad1109ae356da3f5cec3aea1726c323e2 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 6 Apr 2024 23:20:31 -0300 Subject: [PATCH 06/36] FIX Added Weapon trait and current tests run successfully --- src/main/scala/unit/AbstractCharacter.scala | 2 ++ src/main/scala/unit/Character.scala | 4 ++-- src/main/scala/weapon/Weapon.scala | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/main/scala/weapon/Weapon.scala diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 4ffa3cb..6461b03 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -1,5 +1,7 @@ package unit +import weapon.Weapon + abstract class AbstractCharacter extends Units { var heldweapon: Weapon = _ } diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index fb96b50..5a3777d 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -2,7 +2,7 @@ package unit class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String, var mana:Int=0) extends AbstractCharacter { def this(x: String, l: Int, w: Double, p: String) = { - this(x, l, defense, w, p) + this(x, l, 0, w, p) } def this(x: String, l: Int, w: Int, p: String) = { @@ -14,7 +14,7 @@ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int } def this(x: String, l: Int, w: Double, p: String, m: Int) = { - this(x, l, defense, w, p, m) + this(x, l, 0, w, p, m) } def this(x: String, l: Int, w: Int, p: String, m: Int) = { diff --git a/src/main/scala/weapon/Weapon.scala b/src/main/scala/weapon/Weapon.scala new file mode 100644 index 0000000..c2193cc --- /dev/null +++ b/src/main/scala/weapon/Weapon.scala @@ -0,0 +1,8 @@ +package weapon + +trait Weapon { + val name: String + val damage: Int + val weight: Double + var owner: String +} From b9b01f777797a0beadf4dce8b6507a66c826c2ac Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 6 Apr 2024 23:32:13 -0300 Subject: [PATCH 07/36] FIX Improved coverage --- src/test/scala/unit/CharacterTest.scala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index c67476f..4223c14 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -2,6 +2,7 @@ package unit class CharacterTest extends munit.FunSuite { var trainer: Character = _ + var trainer2: Character = _ var magictrainer: Character = _ var weakcharacter: Character = _ var weakcharacter2: Character = _ @@ -9,10 +10,11 @@ class CharacterTest extends munit.FunSuite { override def beforeEach(context: BeforeEach): Unit = { trainer = new Character("TrainerOne", 100, 50, 32.5, "Paladin") - magictrainer = new Character("TrainerTwo", 20, 5, 25, "BlackMage", 1000) - weakcharacter = new Character("TrainerOne", 100, 30, "Ninja") - weakcharacter2 = new Character("TrainerOne", 100, 32.5, "WhiteMage",1) - weakcharacter3 = new Character("TrainerOne", 100, 10, "WhiteMage",1) + trainer2 = new Character("TrainerTwo", 100, 50, 50, "Warrior") + magictrainer = new Character("magic", 20, 5, 25, "BlackMage", 1000) + weakcharacter = new Character("WeakcharacterOne", 100, 30, "Ninja") + weakcharacter2 = new Character("WeakcharacterTwo", 100, 32.5, "WhiteMage",1) + weakcharacter3 = new Character("WeakcharacterThree", 100, 10, "WhiteMage",1) } test("Character constructor checks"){ assertEquals(trainer.name,"TrainerOne") @@ -21,7 +23,9 @@ class CharacterTest extends munit.FunSuite { assertEquals(trainer.weight,32.5) assertEquals(trainer.profession,"Paladin") assertEquals(trainer.mana,0) - assertEquals(magictrainer.name,"TrainerTwo") + assertEquals(trainer2.weight,50.0) + assertEquals(trainer2.heldweapon,null) + assertEquals(magictrainer.name,"magic") assertEquals(magictrainer.life,20) assertEquals(magictrainer.defense,5) assertEquals(magictrainer.weight,25.0) From f44cab790bd1dc2620e0e0b78ebdf08d67c2deaf Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 7 Apr 2024 00:16:53 -0400 Subject: [PATCH 08/36] REFACTOR Added ICharacter trait between Units and AbstractCharacter for Party implementation --- src/main/scala/unit/AbstractCharacter.scala | 2 +- src/main/scala/unit/ICharacter.scala | 3 +++ src/test/scala/unit/CharacterTest.scala | 9 +++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/unit/ICharacter.scala diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 6461b03..5a8de8c 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -2,6 +2,6 @@ package unit import weapon.Weapon -abstract class AbstractCharacter extends Units { +abstract class AbstractCharacter extends ICharacter { var heldweapon: Weapon = _ } diff --git a/src/main/scala/unit/ICharacter.scala b/src/main/scala/unit/ICharacter.scala new file mode 100644 index 0000000..13ab67d --- /dev/null +++ b/src/main/scala/unit/ICharacter.scala @@ -0,0 +1,3 @@ +package unit + +trait ICharacter extends Units diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index 4223c14..f357340 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -7,6 +7,8 @@ class CharacterTest extends munit.FunSuite { var weakcharacter: Character = _ var weakcharacter2: Character = _ var weakcharacter3: Character = _ + var AliveParty: Party = _ + var DeathParty: Party = _ override def beforeEach(context: BeforeEach): Unit = { trainer = new Character("TrainerOne", 100, 50, 32.5, "Paladin") @@ -15,6 +17,9 @@ class CharacterTest extends munit.FunSuite { weakcharacter = new Character("WeakcharacterOne", 100, 30, "Ninja") weakcharacter2 = new Character("WeakcharacterTwo", 100, 32.5, "WhiteMage",1) weakcharacter3 = new Character("WeakcharacterThree", 100, 10, "WhiteMage",1) + AliveParty = new Party(trainer,trainer2) + AliveParty.add(magictrainer) + DeathParty = new Party(new Character(profession = "Warrior"),new Character(profession = "Warrior")) } test("Character constructor checks"){ assertEquals(trainer.name,"TrainerOne") @@ -38,4 +43,8 @@ class CharacterTest extends munit.FunSuite { assertEquals(weakcharacter3.weight,10.0) assertEquals(weakcharacter3.defense,0) } + test("Party Status"){ + assertEquals(AliveParty.isAlive(),true) + assertEquals(DeathParty.isAlive(),false) + } } From 157d60e2111fab9aad2cc98e73b12313b5deefa2 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 7 Apr 2024 00:33:13 -0400 Subject: [PATCH 09/36] FEAT Added Party class --- src/main/scala/unit/Party.scala | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/scala/unit/Party.scala diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala new file mode 100644 index 0000000..455e1b7 --- /dev/null +++ b/src/main/scala/unit/Party.scala @@ -0,0 +1,10 @@ +package unit + +class Party(var member1: ICharacter = null, var member2: ICharacter = null,var member3: ICharacter = null) { + def add(who: ICharacter): Unit = { + if(member1==null)member1=who + else if(member2==null)member2=who + else if(member3==null)member3=who + else return + } +} From c6c21bd8b9fa0d06958cfe0ba21c09d4f17411ee Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 7 Apr 2024 00:59:34 -0400 Subject: [PATCH 10/36] REFACTOR Added DummyCharacter for isAlive method --- src/main/scala/unit/AbstractCharacter.scala | 5 +++++ src/main/scala/unit/DummyCharacter.scala | 3 +++ src/main/scala/unit/Party.scala | 6 ++++-- src/main/scala/unit/Units.scala | 1 + src/test/scala/unit/CharacterTest.scala | 4 ++-- 5 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 src/main/scala/unit/DummyCharacter.scala diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 5a8de8c..0e9e386 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -4,4 +4,9 @@ import weapon.Weapon abstract class AbstractCharacter extends ICharacter { var heldweapon: Weapon = _ + + def isAlive: Boolean = { + if (life > 0) true + else false + } } diff --git a/src/main/scala/unit/DummyCharacter.scala b/src/main/scala/unit/DummyCharacter.scala new file mode 100644 index 0000000..d4af4c5 --- /dev/null +++ b/src/main/scala/unit/DummyCharacter.scala @@ -0,0 +1,3 @@ +package unit + +class DummyCharacter extends Character(profession = null) {} diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index 455e1b7..07c72b4 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -1,10 +1,12 @@ package unit -class Party(var member1: ICharacter = null, var member2: ICharacter = null,var member3: ICharacter = null) { +class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacter = new DummyCharacter,var member3: ICharacter = new DummyCharacter) { def add(who: ICharacter): Unit = { if(member1==null)member1=who else if(member2==null)member2=who else if(member3==null)member3=who - else return + } + def isAlive: Boolean = { + member1.isAlive || member2.isAlive || member3.isAlive } } diff --git a/src/main/scala/unit/Units.scala b/src/main/scala/unit/Units.scala index 8744970..e8ca3df 100644 --- a/src/main/scala/unit/Units.scala +++ b/src/main/scala/unit/Units.scala @@ -5,4 +5,5 @@ trait Units { var life: Int var defense: Int val weight: Double + def isAlive: Boolean } diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index f357340..e663294 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -44,7 +44,7 @@ class CharacterTest extends munit.FunSuite { assertEquals(weakcharacter3.defense,0) } test("Party Status"){ - assertEquals(AliveParty.isAlive(),true) - assertEquals(DeathParty.isAlive(),false) + assertEquals(AliveParty.isAlive,true) + assertEquals(DeathParty.isAlive,false) } } From 731653549bd1d8175a8bc1870d91dc6acb6c8ae7 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Mon, 8 Apr 2024 20:31:17 -0400 Subject: [PATCH 11/36] REFACTOR Split Character into two classes, adding MagicCharacter --- src/main/scala/unit/AbstractCharacter.scala | 1 + src/main/scala/unit/Character.scala | 9 +-------- src/main/scala/unit/MagicCharacter.scala | 16 ++++++++++++++++ src/test/scala/unit/CharacterTest.scala | 16 +++++++++------- 4 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 src/main/scala/unit/MagicCharacter.scala diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 0e9e386..0446349 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -9,4 +9,5 @@ abstract class AbstractCharacter extends ICharacter { if (life > 0) true else false } + } diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index 5a3777d..ac7d6f1 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -1,6 +1,6 @@ package unit -class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String, var mana:Int=0) extends AbstractCharacter { +class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String) extends AbstractCharacter { def this(x: String, l: Int, w: Double, p: String) = { this(x, l, 0, w, p) } @@ -13,11 +13,4 @@ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int this(x, l, d, w.toDouble, p) } - def this(x: String, l: Int, w: Double, p: String, m: Int) = { - this(x, l, 0, w, p, m) - } - - def this(x: String, l: Int, w: Int, p: String, m: Int) = { - this(x, l, w.toDouble, p, m) - } } diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala new file mode 100644 index 0000000..3ff82e6 --- /dev/null +++ b/src/main/scala/unit/MagicCharacter.scala @@ -0,0 +1,16 @@ +package unit + +class MagicCharacter(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String, var mana:Int=0) extends AbstractCharacter { + + def this(x: String, l: Int, w: Double, p: String, m: Int) = { + this(x, l, 0, w, p, m) + } + + def this(x: String, l: Int, w: Int, p: String, m: Int) = { + this(x, l, w.toDouble, p, m) + } + + def this(x: String, l: Int, d: Int, w: Int, p: String, m: Int) = { + this(x, l, d, w.toDouble, p, m) + } +} \ No newline at end of file diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index e663294..0051f45 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -3,20 +3,22 @@ package unit class CharacterTest extends munit.FunSuite { var trainer: Character = _ var trainer2: Character = _ - var magictrainer: Character = _ + var magictrainer: MagicCharacter = _ + var magictrainer2: MagicCharacter = _ var weakcharacter: Character = _ - var weakcharacter2: Character = _ - var weakcharacter3: Character = _ + var weakcharacter2: MagicCharacter = _ + var weakcharacter3: MagicCharacter = _ var AliveParty: Party = _ var DeathParty: Party = _ override def beforeEach(context: BeforeEach): Unit = { trainer = new Character("TrainerOne", 100, 50, 32.5, "Paladin") trainer2 = new Character("TrainerTwo", 100, 50, 50, "Warrior") - magictrainer = new Character("magic", 20, 5, 25, "BlackMage", 1000) + magictrainer = new MagicCharacter("magic", 20, 5, 25, "BlackMage", 1000) + magictrainer2 = new MagicCharacter(profession = "BlackMage",mana=1) weakcharacter = new Character("WeakcharacterOne", 100, 30, "Ninja") - weakcharacter2 = new Character("WeakcharacterTwo", 100, 32.5, "WhiteMage",1) - weakcharacter3 = new Character("WeakcharacterThree", 100, 10, "WhiteMage",1) + weakcharacter2 = new MagicCharacter("WeakcharacterTwo", 100, 32.5, "WhiteMage",1) + weakcharacter3 = new MagicCharacter("WeakcharacterThree", 100, 10, "WhiteMage",1) AliveParty = new Party(trainer,trainer2) AliveParty.add(magictrainer) DeathParty = new Party(new Character(profession = "Warrior"),new Character(profession = "Warrior")) @@ -27,7 +29,6 @@ class CharacterTest extends munit.FunSuite { assertEquals(trainer.defense,50) assertEquals(trainer.weight,32.5) assertEquals(trainer.profession,"Paladin") - assertEquals(trainer.mana,0) assertEquals(trainer2.weight,50.0) assertEquals(trainer2.heldweapon,null) assertEquals(magictrainer.name,"magic") @@ -36,6 +37,7 @@ class CharacterTest extends munit.FunSuite { assertEquals(magictrainer.weight,25.0) assertEquals(magictrainer.profession,"BlackMage") assertEquals(magictrainer.mana,1000) + assertEquals(magictrainer2.mana,1) assertEquals(weakcharacter.weight,30.0) assertEquals(weakcharacter.defense,0) assertEquals(weakcharacter2.weight,32.5) From 4e2e4d32590c58c2c0bcd08d1d0969268c5c8efb Mon Sep 17 00:00:00 2001 From: JTJetc Date: Mon, 8 Apr 2024 21:08:01 -0400 Subject: [PATCH 12/36] FEAT! Added Character 'Classes' aka Professions --- .../scala/profession/AbstractProfession.scala | 4 ++++ src/main/scala/profession/BlackMage.scala | 5 +++++ src/main/scala/profession/Ninja.scala | 5 +++++ src/main/scala/profession/Paladin.scala | 5 +++++ src/main/scala/profession/Profession.scala | 5 +++++ src/main/scala/profession/Warrior.scala | 4 ++++ src/main/scala/profession/WhiteMage.scala | 5 +++++ src/main/scala/unit/Character.scala | 10 +++++---- src/main/scala/unit/ICharacter.scala | 5 ++++- src/main/scala/unit/MagicCharacter.scala | 10 +++++---- src/test/scala/unit/CharacterTest.scala | 22 ++++++++++--------- 11 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 src/main/scala/profession/AbstractProfession.scala create mode 100644 src/main/scala/profession/BlackMage.scala create mode 100644 src/main/scala/profession/Ninja.scala create mode 100644 src/main/scala/profession/Paladin.scala create mode 100644 src/main/scala/profession/Profession.scala create mode 100644 src/main/scala/profession/Warrior.scala create mode 100644 src/main/scala/profession/WhiteMage.scala diff --git a/src/main/scala/profession/AbstractProfession.scala b/src/main/scala/profession/AbstractProfession.scala new file mode 100644 index 0000000..4aec2bf --- /dev/null +++ b/src/main/scala/profession/AbstractProfession.scala @@ -0,0 +1,4 @@ +package profession + +class AbstractProfession(val name:String) extends Profession { +} diff --git a/src/main/scala/profession/BlackMage.scala b/src/main/scala/profession/BlackMage.scala new file mode 100644 index 0000000..147d997 --- /dev/null +++ b/src/main/scala/profession/BlackMage.scala @@ -0,0 +1,5 @@ +package profession + +class BlackMage extends AbstractProfession("BlackMage") { + +} diff --git a/src/main/scala/profession/Ninja.scala b/src/main/scala/profession/Ninja.scala new file mode 100644 index 0000000..24dc08a --- /dev/null +++ b/src/main/scala/profession/Ninja.scala @@ -0,0 +1,5 @@ +package profession + +class Ninja extends AbstractProfession("Ninja") { + +} diff --git a/src/main/scala/profession/Paladin.scala b/src/main/scala/profession/Paladin.scala new file mode 100644 index 0000000..307b9e3 --- /dev/null +++ b/src/main/scala/profession/Paladin.scala @@ -0,0 +1,5 @@ +package profession + +class Paladin extends AbstractProfession("Paladin") { + +} diff --git a/src/main/scala/profession/Profession.scala b/src/main/scala/profession/Profession.scala new file mode 100644 index 0000000..297975a --- /dev/null +++ b/src/main/scala/profession/Profession.scala @@ -0,0 +1,5 @@ +package profession + +trait Profession { + val name: String +} diff --git a/src/main/scala/profession/Warrior.scala b/src/main/scala/profession/Warrior.scala new file mode 100644 index 0000000..40d7640 --- /dev/null +++ b/src/main/scala/profession/Warrior.scala @@ -0,0 +1,4 @@ +package profession + +class Warrior extends AbstractProfession("Warrior") { +} diff --git a/src/main/scala/profession/WhiteMage.scala b/src/main/scala/profession/WhiteMage.scala new file mode 100644 index 0000000..93fb563 --- /dev/null +++ b/src/main/scala/profession/WhiteMage.scala @@ -0,0 +1,5 @@ +package profession + +class WhiteMage extends AbstractProfession("WhiteMage") { + +} diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index ac7d6f1..7bba279 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -1,15 +1,17 @@ package unit -class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String) extends AbstractCharacter { - def this(x: String, l: Int, w: Double, p: String) = { +import profession.Profession + +class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession:Profession) extends AbstractCharacter { + def this(x: String, l: Int, w: Double, p: Profession) = { this(x, l, 0, w, p) } - def this(x: String, l: Int, w: Int, p: String) = { + def this(x: String, l: Int, w: Int, p: Profession) = { this(x, l, w.toDouble, p) } - def this(x: String, l: Int, d: Int, w: Int, p: String) = { + def this(x: String, l: Int, d: Int, w: Int, p: Profession) = { this(x, l, d, w.toDouble, p) } diff --git a/src/main/scala/unit/ICharacter.scala b/src/main/scala/unit/ICharacter.scala index 13ab67d..50a437a 100644 --- a/src/main/scala/unit/ICharacter.scala +++ b/src/main/scala/unit/ICharacter.scala @@ -1,3 +1,6 @@ package unit +import profession.Profession -trait ICharacter extends Units +trait ICharacter extends Units{ + val profession:Profession +} diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index 3ff82e6..9efe00d 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -1,16 +1,18 @@ package unit -class MagicCharacter(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession: String, var mana:Int=0) extends AbstractCharacter { +import profession.Profession - def this(x: String, l: Int, w: Double, p: String, m: Int) = { +class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defense: Int = 0, val weight: Double = 0.1, val profession: Profession, var mana:Int=0) extends AbstractCharacter { + + def this(x: String, l: Int, w: Double, p: Profession, m: Int) = { this(x, l, 0, w, p, m) } - def this(x: String, l: Int, w: Int, p: String, m: Int) = { + def this(x: String, l: Int, w: Int, p: Profession, m: Int) = { this(x, l, w.toDouble, p, m) } - def this(x: String, l: Int, d: Int, w: Int, p: String, m: Int) = { + def this(x: String, l: Int, d: Int, w: Int, p: Profession, m: Int) = { this(x, l, d, w.toDouble, p, m) } } \ No newline at end of file diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index 0051f45..a22500f 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -1,5 +1,7 @@ package unit +import profession.{BlackMage, Ninja, Paladin, Warrior, WhiteMage} + class CharacterTest extends munit.FunSuite { var trainer: Character = _ var trainer2: Character = _ @@ -12,30 +14,30 @@ class CharacterTest extends munit.FunSuite { var DeathParty: Party = _ override def beforeEach(context: BeforeEach): Unit = { - trainer = new Character("TrainerOne", 100, 50, 32.5, "Paladin") - trainer2 = new Character("TrainerTwo", 100, 50, 50, "Warrior") - magictrainer = new MagicCharacter("magic", 20, 5, 25, "BlackMage", 1000) - magictrainer2 = new MagicCharacter(profession = "BlackMage",mana=1) - weakcharacter = new Character("WeakcharacterOne", 100, 30, "Ninja") - weakcharacter2 = new MagicCharacter("WeakcharacterTwo", 100, 32.5, "WhiteMage",1) - weakcharacter3 = new MagicCharacter("WeakcharacterThree", 100, 10, "WhiteMage",1) + trainer = new Character("TrainerOne", 100, 50, 32.5, new Paladin) + trainer2 = new Character("TrainerTwo", 100, 50, 50, new Warrior) + magictrainer = new MagicCharacter("magic", 20, 5, 25, new BlackMage, 1000) + magictrainer2 = new MagicCharacter(profession = new BlackMage,mana=1) + weakcharacter = new Character("WeakcharacterOne", 100, 30, new Ninja) + weakcharacter2 = new MagicCharacter("WeakcharacterTwo", 100, 32.5, new WhiteMage,1) + weakcharacter3 = new MagicCharacter("WeakcharacterThree", 100, 10, new WhiteMage,1) AliveParty = new Party(trainer,trainer2) AliveParty.add(magictrainer) - DeathParty = new Party(new Character(profession = "Warrior"),new Character(profession = "Warrior")) + DeathParty = new Party(new Character(profession = new Warrior),new Character(profession = new Warrior)) } test("Character constructor checks"){ assertEquals(trainer.name,"TrainerOne") assertEquals(trainer.life,100) assertEquals(trainer.defense,50) assertEquals(trainer.weight,32.5) - assertEquals(trainer.profession,"Paladin") + assertEquals(trainer.profession.name,new Paladin().name) assertEquals(trainer2.weight,50.0) assertEquals(trainer2.heldweapon,null) assertEquals(magictrainer.name,"magic") assertEquals(magictrainer.life,20) assertEquals(magictrainer.defense,5) assertEquals(magictrainer.weight,25.0) - assertEquals(magictrainer.profession,"BlackMage") + assertEquals(magictrainer.profession.name,new BlackMage().name) assertEquals(magictrainer.mana,1000) assertEquals(magictrainer2.mana,1) assertEquals(weakcharacter.weight,30.0) From 5cf2f388ef5215a9ee351a77c5cdcd4891a2ef9a Mon Sep 17 00:00:00 2001 From: JTJetc Date: Tue, 9 Apr 2024 21:16:20 -0400 Subject: [PATCH 13/36] FEAT Added Enemy Trait --- src/main/scala/unit/Enemy.scala | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/scala/unit/Enemy.scala diff --git a/src/main/scala/unit/Enemy.scala b/src/main/scala/unit/Enemy.scala new file mode 100644 index 0000000..2362b8e --- /dev/null +++ b/src/main/scala/unit/Enemy.scala @@ -0,0 +1,5 @@ +package unit + +trait Enemy extends Units{ +var damage: Int +} From 054eefea1ba871ae51dd7ed390ceb198e5097be3 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Tue, 9 Apr 2024 21:48:44 -0400 Subject: [PATCH 14/36] FEAT Added Common and Magic Weapons --- src/main/scala/unit/Character.scala | 8 ---- src/main/scala/unit/MagicCharacter.scala | 7 --- .../scala/weapon/AbstractCommonWeapon.scala | 5 ++ .../scala/weapon/AbstractMagicWeapon.scala | 5 ++ src/main/scala/weapon/Axe.scala | 7 +++ src/main/scala/weapon/Bow.scala | 7 +++ src/main/scala/weapon/Staff.scala | 7 +++ src/main/scala/weapon/Sword.scala | 7 +++ src/main/scala/weapon/Wand.scala | 7 +++ src/main/scala/weapon/Weapon.scala | 4 +- src/test/scala/unit/CharacterTest.scala | 48 +++++++++---------- src/test/scala/weapon/WeaponTest.scala | 16 +++++++ 12 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 src/main/scala/weapon/AbstractCommonWeapon.scala create mode 100644 src/main/scala/weapon/AbstractMagicWeapon.scala create mode 100644 src/main/scala/weapon/Axe.scala create mode 100644 src/main/scala/weapon/Bow.scala create mode 100644 src/main/scala/weapon/Staff.scala create mode 100644 src/main/scala/weapon/Sword.scala create mode 100644 src/main/scala/weapon/Wand.scala create mode 100644 src/test/scala/weapon/WeaponTest.scala diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index 7bba279..eb980f1 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -7,12 +7,4 @@ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int this(x, l, 0, w, p) } - def this(x: String, l: Int, w: Int, p: Profession) = { - this(x, l, w.toDouble, p) - } - - def this(x: String, l: Int, d: Int, w: Int, p: Profession) = { - this(x, l, d, w.toDouble, p) - } - } diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index 9efe00d..c8b1d53 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -8,11 +8,4 @@ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defens this(x, l, 0, w, p, m) } - def this(x: String, l: Int, w: Int, p: Profession, m: Int) = { - this(x, l, w.toDouble, p, m) - } - - def this(x: String, l: Int, d: Int, w: Int, p: Profession, m: Int) = { - this(x, l, d, w.toDouble, p, m) - } } \ No newline at end of file diff --git a/src/main/scala/weapon/AbstractCommonWeapon.scala b/src/main/scala/weapon/AbstractCommonWeapon.scala new file mode 100644 index 0000000..bb2d42a --- /dev/null +++ b/src/main/scala/weapon/AbstractCommonWeapon.scala @@ -0,0 +1,5 @@ +package weapon + +abstract class AbstractCommonWeapon extends Weapon{ + +} diff --git a/src/main/scala/weapon/AbstractMagicWeapon.scala b/src/main/scala/weapon/AbstractMagicWeapon.scala new file mode 100644 index 0000000..a948bca --- /dev/null +++ b/src/main/scala/weapon/AbstractMagicWeapon.scala @@ -0,0 +1,5 @@ +package weapon + +abstract class AbstractMagicWeapon(val magic_damage: Int) extends Weapon{ + +} diff --git a/src/main/scala/weapon/Axe.scala b/src/main/scala/weapon/Axe.scala new file mode 100644 index 0000000..8166f54 --- /dev/null +++ b/src/main/scala/weapon/Axe.scala @@ -0,0 +1,7 @@ +package weapon + +import unit.ICharacter + +class Axe(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { + +} diff --git a/src/main/scala/weapon/Bow.scala b/src/main/scala/weapon/Bow.scala new file mode 100644 index 0000000..004c84b --- /dev/null +++ b/src/main/scala/weapon/Bow.scala @@ -0,0 +1,7 @@ +package weapon + +import unit.ICharacter + +class Bow(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { + +} diff --git a/src/main/scala/weapon/Staff.scala b/src/main/scala/weapon/Staff.scala new file mode 100644 index 0000000..ad06eb1 --- /dev/null +++ b/src/main/scala/weapon/Staff.scala @@ -0,0 +1,7 @@ +package weapon + +import unit.ICharacter + +class Staff(val name:String, val damage:Int, val weight:Double, var owner:ICharacter, magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { + +} diff --git a/src/main/scala/weapon/Sword.scala b/src/main/scala/weapon/Sword.scala new file mode 100644 index 0000000..fec76a1 --- /dev/null +++ b/src/main/scala/weapon/Sword.scala @@ -0,0 +1,7 @@ +package weapon + +import unit.ICharacter + +class Sword(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { + +} diff --git a/src/main/scala/weapon/Wand.scala b/src/main/scala/weapon/Wand.scala new file mode 100644 index 0000000..f8dbdfe --- /dev/null +++ b/src/main/scala/weapon/Wand.scala @@ -0,0 +1,7 @@ +package weapon + +import unit.ICharacter + +class Wand(val name:String, val damage:Int, val weight:Double, var owner:ICharacter, magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { + +} diff --git a/src/main/scala/weapon/Weapon.scala b/src/main/scala/weapon/Weapon.scala index c2193cc..725487e 100644 --- a/src/main/scala/weapon/Weapon.scala +++ b/src/main/scala/weapon/Weapon.scala @@ -1,8 +1,10 @@ package weapon +import unit.ICharacter + trait Weapon { val name: String val damage: Int val weight: Double - var owner: String + var owner: ICharacter } diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index a22500f..c981bdf 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -5,24 +5,24 @@ import profession.{BlackMage, Ninja, Paladin, Warrior, WhiteMage} class CharacterTest extends munit.FunSuite { var trainer: Character = _ var trainer2: Character = _ - var magictrainer: MagicCharacter = _ - var magictrainer2: MagicCharacter = _ - var weakcharacter: Character = _ - var weakcharacter2: MagicCharacter = _ - var weakcharacter3: MagicCharacter = _ + var magic_trainer: MagicCharacter = _ + var magic_trainer2: MagicCharacter = _ + var weak_character: Character = _ + var weak_character2: MagicCharacter = _ + var weak_character3: MagicCharacter = _ var AliveParty: Party = _ var DeathParty: Party = _ override def beforeEach(context: BeforeEach): Unit = { trainer = new Character("TrainerOne", 100, 50, 32.5, new Paladin) trainer2 = new Character("TrainerTwo", 100, 50, 50, new Warrior) - magictrainer = new MagicCharacter("magic", 20, 5, 25, new BlackMage, 1000) - magictrainer2 = new MagicCharacter(profession = new BlackMage,mana=1) - weakcharacter = new Character("WeakcharacterOne", 100, 30, new Ninja) - weakcharacter2 = new MagicCharacter("WeakcharacterTwo", 100, 32.5, new WhiteMage,1) - weakcharacter3 = new MagicCharacter("WeakcharacterThree", 100, 10, new WhiteMage,1) + magic_trainer = new MagicCharacter("magic", 20, 5, 25, new BlackMage, 1000) + magic_trainer2 = new MagicCharacter(profession = new BlackMage,mana=1) + weak_character = new Character("Weak characterOne", 100, 30, new Ninja) + weak_character2 = new MagicCharacter("Weak characterTwo", 100, 32.5, new WhiteMage,1) + weak_character3 = new MagicCharacter("Weak characterThree", 100, 10, new WhiteMage,1) AliveParty = new Party(trainer,trainer2) - AliveParty.add(magictrainer) + AliveParty.add(magic_trainer) DeathParty = new Party(new Character(profession = new Warrior),new Character(profession = new Warrior)) } test("Character constructor checks"){ @@ -33,19 +33,19 @@ class CharacterTest extends munit.FunSuite { assertEquals(trainer.profession.name,new Paladin().name) assertEquals(trainer2.weight,50.0) assertEquals(trainer2.heldweapon,null) - assertEquals(magictrainer.name,"magic") - assertEquals(magictrainer.life,20) - assertEquals(magictrainer.defense,5) - assertEquals(magictrainer.weight,25.0) - assertEquals(magictrainer.profession.name,new BlackMage().name) - assertEquals(magictrainer.mana,1000) - assertEquals(magictrainer2.mana,1) - assertEquals(weakcharacter.weight,30.0) - assertEquals(weakcharacter.defense,0) - assertEquals(weakcharacter2.weight,32.5) - assertEquals(weakcharacter2.defense,0) - assertEquals(weakcharacter3.weight,10.0) - assertEquals(weakcharacter3.defense,0) + assertEquals(magic_trainer.name,"magic") + assertEquals(magic_trainer.life,20) + assertEquals(magic_trainer.defense,5) + assertEquals(magic_trainer.weight,25.0) + assertEquals(magic_trainer.profession.name,new BlackMage().name) + assertEquals(magic_trainer.mana,1000) + assertEquals(magic_trainer2.mana,1) + assertEquals(weak_character.weight,30.0) + assertEquals(weak_character.defense,0) + assertEquals(weak_character2.weight,32.5) + assertEquals(weak_character2.defense,0) + assertEquals(weak_character3.weight,10.0) + assertEquals(weak_character3.defense,0) } test("Party Status"){ assertEquals(AliveParty.isAlive,true) diff --git a/src/test/scala/weapon/WeaponTest.scala b/src/test/scala/weapon/WeaponTest.scala new file mode 100644 index 0000000..fa881aa --- /dev/null +++ b/src/test/scala/weapon/WeaponTest.scala @@ -0,0 +1,16 @@ +package weapon + +import unit.DummyCharacter + +class WeaponTest extends munit.FunSuite { + var TestSword: Sword = new Sword("Starter Sword",5,10,new DummyCharacter) + var TestAxe: Axe = new Axe("Starter Axe",15,30.5,new DummyCharacter) + var TestBow: Bow = new Bow("Starter Bow",10,8.25,new DummyCharacter) + var TestWand: Wand = new Wand("Starter Wand",5,3,new DummyCharacter,20) + var TestStaff: Staff = new Staff("Starter Staff",10,17.5,new DummyCharacter,15) + + test("Weapons Constructors Tests"){ + assertEquals(TestSword.weight,10.0) + assertEquals(TestStaff.magic_damage,15) + } +} From 1a084ebf8bf7d2e882951de4c922e020470b16e6 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Tue, 9 Apr 2024 23:08:38 -0400 Subject: [PATCH 15/36] DOC Added project explaining to the readme --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index e7d6320..15bf23e 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,21 @@ serve as an educational tool, teaching foundational programming concepts. This README is yours to complete it. Take this opportunity to describe your contributions, the design decisions you've made, and any other information you deem necessary. +## 1° Assigment +### Partial Assigment 1 +- Made sure to not use words "Unit", "Class", "def" for naming, to avoid problems with existing +fields, instead used "Units", "Profession", and "defense". +- Packages/folders for Weapons, Professions, and Units which correspond to Characters and Enemies. +- Units trait for common stats between enemies and player characters. +- ICharacter trait adds profession field and Enemy trait adds damage. +- Abstract class for empty held weapon and isAlive method, common in all characters. +- Party class, with default dummy characters, can ask members if they are alive to determine if whole party +is alive, and can add members up to three. +- Profession trait with name implemented by each profession extending from abstract class +constructor, which will be easier to compare later. +- Weapon trait for common attributes, and two abstract classes for common and magic weapons with magic damage. +- Tests with munit.FunSuite, mainly of constructors, making sure to have good coverage. + + This project is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file From d6df54f5ed9a22e52c2ee4b1cd07cf97be5fe048 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Thu, 11 Apr 2024 21:38:21 -0400 Subject: [PATCH 16/36] FEAT Added EnemyClass --- src/main/scala/unit/EnemyClass.scala | 8 ++++++++ src/test/scala/unit/CharacterTest.scala | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 src/main/scala/unit/EnemyClass.scala diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala new file mode 100644 index 0000000..f6b8090 --- /dev/null +++ b/src/main/scala/unit/EnemyClass.scala @@ -0,0 +1,8 @@ +package unit + +class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, val weight:Double) extends Enemy{ + def isAlive: Boolean = { + if (life > 0) true + else false + } +} diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index c981bdf..934f633 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -12,6 +12,7 @@ class CharacterTest extends munit.FunSuite { var weak_character3: MagicCharacter = _ var AliveParty: Party = _ var DeathParty: Party = _ + var some_enemy: Enemy = _ override def beforeEach(context: BeforeEach): Unit = { trainer = new Character("TrainerOne", 100, 50, 32.5, new Paladin) @@ -24,6 +25,7 @@ class CharacterTest extends munit.FunSuite { AliveParty = new Party(trainer,trainer2) AliveParty.add(magic_trainer) DeathParty = new Party(new Character(profession = new Warrior),new Character(profession = new Warrior)) + some_enemy = new EnemyClass("Bob",5,50,3,100.5) } test("Character constructor checks"){ assertEquals(trainer.name,"TrainerOne") @@ -51,4 +53,9 @@ class CharacterTest extends munit.FunSuite { assertEquals(AliveParty.isAlive,true) assertEquals(DeathParty.isAlive,false) } + test("Enemies"){ + assertEquals(some_enemy.isAlive,true) + some_enemy.life = 0 + assertEquals(some_enemy.isAlive,false) + } } From 8b239701d90c21c204baf5ec5a55ca883c5d9740 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Fri, 12 Apr 2024 20:11:07 -0400 Subject: [PATCH 17/36] DOC Added documentation and renamed WhiteMage and BlackMage to White Mage and Black Mage --- .../scala/profession/AbstractProfession.scala | 12 ++++++++++++ src/main/scala/profession/BlackMage.scala | 12 +++++++++++- src/main/scala/profession/Ninja.scala | 10 ++++++++++ src/main/scala/profession/Paladin.scala | 10 ++++++++++ src/main/scala/profession/Profession.scala | 4 ++++ src/main/scala/profession/Warrior.scala | 10 ++++++++++ src/main/scala/profession/WhiteMage.scala | 12 +++++++++++- src/main/scala/weapon/AbstractCommonWeapon.scala | 8 ++++++++ src/main/scala/weapon/AbstractMagicWeapon.scala | 10 ++++++++++ src/main/scala/weapon/Axe.scala | 15 +++++++++++++++ src/main/scala/weapon/Bow.scala | 15 +++++++++++++++ src/main/scala/weapon/Staff.scala | 16 ++++++++++++++++ src/main/scala/weapon/Sword.scala | 15 +++++++++++++++ src/main/scala/weapon/Wand.scala | 16 ++++++++++++++++ src/main/scala/weapon/Weapon.scala | 4 ++++ src/test/scala/unit/CharacterTest.scala | 4 ++-- 16 files changed, 169 insertions(+), 4 deletions(-) diff --git a/src/main/scala/profession/AbstractProfession.scala b/src/main/scala/profession/AbstractProfession.scala index 4aec2bf..ae7937f 100644 --- a/src/main/scala/profession/AbstractProfession.scala +++ b/src/main/scala/profession/AbstractProfession.scala @@ -1,4 +1,16 @@ package profession +/** Abstract class representing professions. + * + * Professions name must be provided by the subclasses. + * + * Used by [[profession.Warrior]], [[profession.Paladin]], [[profession.Ninja]], [[profession.BlackMage]], and [[profession.WhiteMage]] + * + * @param name The name of the profession. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class AbstractProfession(val name:String) extends Profession { } diff --git a/src/main/scala/profession/BlackMage.scala b/src/main/scala/profession/BlackMage.scala index 147d997..42f2e6f 100644 --- a/src/main/scala/profession/BlackMage.scala +++ b/src/main/scala/profession/BlackMage.scala @@ -1,5 +1,15 @@ package profession -class BlackMage extends AbstractProfession("BlackMage") { +/** Class representing Black Mage Profession. + * + * Sends "Black Mage" for name to [[profession.AbstractProfession]] superclass + * + * @constructor Creates a new Black Mage Profession. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ +class BlackMage extends AbstractProfession("Black Mage") { } diff --git a/src/main/scala/profession/Ninja.scala b/src/main/scala/profession/Ninja.scala index 24dc08a..c09f6d6 100644 --- a/src/main/scala/profession/Ninja.scala +++ b/src/main/scala/profession/Ninja.scala @@ -1,5 +1,15 @@ package profession +/** Class representing Ninja Profession. + * + * Sends "Ninja" for name to [[profession.AbstractProfession]] superclass + * + * @constructor Creates a new Ninja Profession. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Ninja extends AbstractProfession("Ninja") { } diff --git a/src/main/scala/profession/Paladin.scala b/src/main/scala/profession/Paladin.scala index 307b9e3..f0c1d00 100644 --- a/src/main/scala/profession/Paladin.scala +++ b/src/main/scala/profession/Paladin.scala @@ -1,5 +1,15 @@ package profession +/** Class representing Paladin Profession. + * + * Sends "Paladin" for name to [[profession.AbstractProfession]] superclass + * + * @constructor Creates a new Paladin Profession. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Paladin extends AbstractProfession("Paladin") { } diff --git a/src/main/scala/profession/Profession.scala b/src/main/scala/profession/Profession.scala index 297975a..0778cf1 100644 --- a/src/main/scala/profession/Profession.scala +++ b/src/main/scala/profession/Profession.scala @@ -1,5 +1,9 @@ package profession +/** Trait mainly used for type in constructors. + * Also provides a name for the profession. + * Used by [[profession.AbstractProfession]] + */ trait Profession { val name: String } diff --git a/src/main/scala/profession/Warrior.scala b/src/main/scala/profession/Warrior.scala index 40d7640..e3f1777 100644 --- a/src/main/scala/profession/Warrior.scala +++ b/src/main/scala/profession/Warrior.scala @@ -1,4 +1,14 @@ package profession +/** Class representing Warrior Profession. + * + * Sends "Warrior" for name to [[profession.AbstractProfession]] superclass + * + * @constructor Creates a new Warrior Profession. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Warrior extends AbstractProfession("Warrior") { } diff --git a/src/main/scala/profession/WhiteMage.scala b/src/main/scala/profession/WhiteMage.scala index 93fb563..87abfe1 100644 --- a/src/main/scala/profession/WhiteMage.scala +++ b/src/main/scala/profession/WhiteMage.scala @@ -1,5 +1,15 @@ package profession -class WhiteMage extends AbstractProfession("WhiteMage") { +/** Class representing White Mage Profession. + * + * Sends "White Mage" for name to [[profession.AbstractProfession]] superclass + * + * @constructor Creates a new White Mage Profession. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ +class WhiteMage extends AbstractProfession("White Mage") { } diff --git a/src/main/scala/weapon/AbstractCommonWeapon.scala b/src/main/scala/weapon/AbstractCommonWeapon.scala index bb2d42a..826bec1 100644 --- a/src/main/scala/weapon/AbstractCommonWeapon.scala +++ b/src/main/scala/weapon/AbstractCommonWeapon.scala @@ -1,5 +1,13 @@ package weapon +/** Abstract class representing non magic weapons. + * + * Used by [[weapon.Axe]], [[weapon.Bow]], and [[weapon.Sword]] + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ abstract class AbstractCommonWeapon extends Weapon{ } diff --git a/src/main/scala/weapon/AbstractMagicWeapon.scala b/src/main/scala/weapon/AbstractMagicWeapon.scala index a948bca..340eca0 100644 --- a/src/main/scala/weapon/AbstractMagicWeapon.scala +++ b/src/main/scala/weapon/AbstractMagicWeapon.scala @@ -1,5 +1,15 @@ package weapon +/** Abstract class representing magic weapons. + * + * Used by [[weapon.Staff]], and [[weapon.Wand]] + * + * @param magic_damage The magic damage of the weapon. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ abstract class AbstractMagicWeapon(val magic_damage: Int) extends Weapon{ } diff --git a/src/main/scala/weapon/Axe.scala b/src/main/scala/weapon/Axe.scala index 8166f54..5f35132 100644 --- a/src/main/scala/weapon/Axe.scala +++ b/src/main/scala/weapon/Axe.scala @@ -2,6 +2,21 @@ package weapon import unit.ICharacter +/** Class representing an Axe. + * + * When initializing, owner can be a [[unit.DummyCharacter]] + * + * @param name The name of the weapon. + * @param damage The damage of the weapon. + * @param weight The weight of the weapon. + * @param owner The owner of the weapon. + * + * @constructor Creates a new Axe. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Axe(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { } diff --git a/src/main/scala/weapon/Bow.scala b/src/main/scala/weapon/Bow.scala index 004c84b..4be6a69 100644 --- a/src/main/scala/weapon/Bow.scala +++ b/src/main/scala/weapon/Bow.scala @@ -2,6 +2,21 @@ package weapon import unit.ICharacter +/** Class representing a Bow. + * + * When initializing, owner can be a [[unit.DummyCharacter]] + * + * @param name The name of the weapon. + * @param damage The damage of the weapon. + * @param weight The weight of the weapon. + * @param owner The owner of the weapon. + * + * @constructor Creates a new Bow. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Bow(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { } diff --git a/src/main/scala/weapon/Staff.scala b/src/main/scala/weapon/Staff.scala index ad06eb1..fe2bcb7 100644 --- a/src/main/scala/weapon/Staff.scala +++ b/src/main/scala/weapon/Staff.scala @@ -2,6 +2,22 @@ package weapon import unit.ICharacter +/** Class representing a Staff. + * + * When initializing, owner can be a [[unit.DummyCharacter]] + * + * @param name The name of the weapon. + * @param damage The damage of the weapon. + * @param weight The weight of the weapon. + * @param owner The owner of the weapon. + * @param magic_damage The magic damage of the weapon. + * + * @constructor Creates a new Staff. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Staff(val name:String, val damage:Int, val weight:Double, var owner:ICharacter, magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { } diff --git a/src/main/scala/weapon/Sword.scala b/src/main/scala/weapon/Sword.scala index fec76a1..b676ab0 100644 --- a/src/main/scala/weapon/Sword.scala +++ b/src/main/scala/weapon/Sword.scala @@ -2,6 +2,21 @@ package weapon import unit.ICharacter +/** Class representing a Sword. + * + * When initializing, owner can be a [[unit.DummyCharacter]] + * + * @param name The name of the weapon. + * @param damage The damage of the weapon. + * @param weight The weight of the weapon. + * @param owner The owner of the weapon. + * + * @constructor Creates a new Sword. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Sword(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { } diff --git a/src/main/scala/weapon/Wand.scala b/src/main/scala/weapon/Wand.scala index f8dbdfe..29e23bc 100644 --- a/src/main/scala/weapon/Wand.scala +++ b/src/main/scala/weapon/Wand.scala @@ -2,6 +2,22 @@ package weapon import unit.ICharacter +/** Class representing a Wand. + * + * When initializing, owner can be a [[unit.DummyCharacter]] + * + * @param name The name of the weapon. + * @param damage The damage of the weapon. + * @param weight The weight of the weapon. + * @param owner The owner of the weapon. + * @param magic_damage The magic damage of the weapon. + * + * @constructor Creates a new Wand. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Wand(val name:String, val damage:Int, val weight:Double, var owner:ICharacter, magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { } diff --git a/src/main/scala/weapon/Weapon.scala b/src/main/scala/weapon/Weapon.scala index 725487e..edf7a20 100644 --- a/src/main/scala/weapon/Weapon.scala +++ b/src/main/scala/weapon/Weapon.scala @@ -2,6 +2,10 @@ package weapon import unit.ICharacter +/** Trait represents common attributes shared by all weapons. + * + * Used by [[weapon.AbstractCommonWeapon]] and [[weapon.AbstractMagicWeapon]] + */ trait Weapon { val name: String val damage: Int diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index 934f633..d655618 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -32,14 +32,14 @@ class CharacterTest extends munit.FunSuite { assertEquals(trainer.life,100) assertEquals(trainer.defense,50) assertEquals(trainer.weight,32.5) - assertEquals(trainer.profession.name,new Paladin().name) + assertEquals(trainer.profession.name,"Paladin") assertEquals(trainer2.weight,50.0) assertEquals(trainer2.heldweapon,null) assertEquals(magic_trainer.name,"magic") assertEquals(magic_trainer.life,20) assertEquals(magic_trainer.defense,5) assertEquals(magic_trainer.weight,25.0) - assertEquals(magic_trainer.profession.name,new BlackMage().name) + assertEquals(magic_trainer.profession.name,"Black Mage") assertEquals(magic_trainer.mana,1000) assertEquals(magic_trainer2.mana,1) assertEquals(weak_character.weight,30.0) From 3dfb2bc6b105e6a113288b0a00b0a0d467626f11 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Fri, 12 Apr 2024 21:32:42 -0400 Subject: [PATCH 18/36] DOC Added more documentation and fixed miscellaneous typos --- src/main/scala/unit/AbstractCharacter.scala | 14 +++++++++ src/main/scala/unit/Character.scala | 17 ++++++++++ src/main/scala/unit/DummyCharacter.scala | 17 +++++++++- src/main/scala/unit/Enemy.scala | 4 +++ src/main/scala/unit/EnemyClass.scala | 14 +++++++++ src/main/scala/unit/ICharacter.scala | 4 +++ src/main/scala/unit/MagicCharacter.scala | 19 ++++++++++- src/main/scala/unit/Party.scala | 35 +++++++++++++++++++-- src/main/scala/unit/Units.scala | 11 +++++++ 9 files changed, 130 insertions(+), 5 deletions(-) diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 0446349..1af22c7 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -2,7 +2,21 @@ package unit import weapon.Weapon +/** Abstract class representing Characters. + * + * Professions name must be provided by the subclasses. + * + * Used by [[unit.Character]], and [[unit.MagicCharacter]] + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ abstract class AbstractCharacter extends ICharacter { + /** The weapon this character is holding. + * + * Starts by default empty, meaning no held weapon. + */ var heldweapon: Weapon = _ def isAlive: Boolean = { diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index eb980f1..862ae41 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -2,7 +2,24 @@ package unit import profession.Profession +/** Class representing a Character. + * + * When initializing, one can skip the defense value, alternative constructor defaults it to 0. + * + * @param name The name of the character. + * @param life The life of the character. + * @param defense The defense of the character. + * @param weight The weight of the character. + * @param profession The profession of the character. + * + * @constructor Creates a new Character. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.1 + */ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession:Profession) extends AbstractCharacter { + /** Alternative constructor if one where to skip defense, defaulting it to 0 */ def this(x: String, l: Int, w: Double, p: Profession) = { this(x, l, 0, w, p) } diff --git a/src/main/scala/unit/DummyCharacter.scala b/src/main/scala/unit/DummyCharacter.scala index d4af4c5..91784d5 100644 --- a/src/main/scala/unit/DummyCharacter.scala +++ b/src/main/scala/unit/DummyCharacter.scala @@ -1,3 +1,18 @@ package unit -class DummyCharacter extends Character(profession = null) {} +/** Class representing a special case Character + * + * This Dummy is used for empty party members, and also initializing weapons to have no owner. + * Methods implemented here should make it easier by not checking if there is a real character present. + * + * Extends from [[unit.Character]], with null profession to check empty members in party. + * + * @example isAlive method always returns false, ideal for checking party status with any empty party members. + * @constructor Creates a new Dummy. + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ +class DummyCharacter extends Character(profession = null) { + life = 0 +} diff --git a/src/main/scala/unit/Enemy.scala b/src/main/scala/unit/Enemy.scala index 2362b8e..53fcee6 100644 --- a/src/main/scala/unit/Enemy.scala +++ b/src/main/scala/unit/Enemy.scala @@ -1,5 +1,9 @@ package unit +/** Trait mainly used for type in constructors. + * Also provides a damage value to enemies. + * Used by [[unit.EnemyClass]] + */ trait Enemy extends Units{ var damage: Int } diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index f6b8090..900e1ea 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -1,5 +1,19 @@ package unit +/** Class representing an Enemy. + * + * @param name The name of the enemy. + * @param life The life of the enemy. + * @param damage The damage of the enemy. + * @param defense The defense of the enemy. + * @param weight The weight of the enemy. + * + * @constructor Creates a new Enemy. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, val weight:Double) extends Enemy{ def isAlive: Boolean = { if (life > 0) true diff --git a/src/main/scala/unit/ICharacter.scala b/src/main/scala/unit/ICharacter.scala index 50a437a..3bdd30c 100644 --- a/src/main/scala/unit/ICharacter.scala +++ b/src/main/scala/unit/ICharacter.scala @@ -1,6 +1,10 @@ package unit import profession.Profession +/** Trait mainly used for type in constructors. + * Also provides a profession to the character. + * Used by [[unit.AbstractCharacter]] + */ trait ICharacter extends Units{ val profession:Profession } diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index c8b1d53..32f5d3e 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -2,8 +2,25 @@ package unit import profession.Profession +/** Class representing a Magic Character. + * + * When initializing, one can skip the defense value, alternative constructor defaults it to 0. + * + * @param name The name of the magic character. + * @param life The life of the magic character. + * @param defense The defense of the magic character. + * @param weight The weight of the magic character. + * @param profession The profession of the magic character. + * @param mana The mana of the magic character. + * + * @constructor Creates a new Magic Character. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.1 + */ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defense: Int = 0, val weight: Double = 0.1, val profession: Profession, var mana:Int=0) extends AbstractCharacter { - + /** Alternative constructor if one where to skip defense, defaulting it to 0 */ def this(x: String, l: Int, w: Double, p: Profession, m: Int) = { this(x, l, 0, w, p, m) } diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index 07c72b4..89a07af 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -1,11 +1,40 @@ package unit +/** Class representing a Party. + * + * When initializing, the slots get filled with dummy characters if no character is inputted. + * + * @param member1 The first member in party. + * @param member2 The second member in party. + * @param member3 The third member in party. + * + * @constructor Creates a new Party. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacter = new DummyCharacter,var member3: ICharacter = new DummyCharacter) { + + /** Adds a member to one of the party slots + * + * Check member slots from 1 to 3, and if a null profession is found, it means it has a Dummy to replace with a real character. + * Otherwise does nothing. + * + * @param who The character to be added to the party. + */ def add(who: ICharacter): Unit = { - if(member1==null)member1=who - else if(member2==null)member2=who - else if(member3==null)member3=who + if(member1.profession==null)member1=who + else if(member2.profession==null)member2=who + else if(member3.profession==null)member3=who } + + /** Determines if the party is alive. + * + * Calls each member isAlive method, returns true if anyone returns true. + * + * @return If the party is alive + */ def isAlive: Boolean = { member1.isAlive || member2.isAlive || member3.isAlive } diff --git a/src/main/scala/unit/Units.scala b/src/main/scala/unit/Units.scala index e8ca3df..6e1e12c 100644 --- a/src/main/scala/unit/Units.scala +++ b/src/main/scala/unit/Units.scala @@ -1,9 +1,20 @@ package unit +/** Trait represents common attributes shared by playable characters and enemies. + * + * Used by [[unit.ICharacter]] and [[unit.Enemy]] + */ trait Units { val name: String var life: Int var defense: Int val weight: Double + + /** Determines if the current entity is alive. + * + * Checks if current life is above 0, returns true if it is, otherwise returns false. + * + * @return If the entity is alive + */ def isAlive: Boolean } From 4f282598286eb30bc5aa745c8c04aa6f44421d02 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Tue, 16 Apr 2024 19:00:09 -0400 Subject: [PATCH 19/36] Branch Creation --- src/main/scala/combatsystem/Programmer.scala | 11 +++++++++++ src/main/scala/unit/IParty.scala | 5 +++++ src/main/scala/unit/Party.scala | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/combatsystem/Programmer.scala create mode 100644 src/main/scala/unit/IParty.scala diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala new file mode 100644 index 0000000..0ddb8c7 --- /dev/null +++ b/src/main/scala/combatsystem/Programmer.scala @@ -0,0 +1,11 @@ +package combatsystem +import unit.{Enemy, IParty} + +class Programmer(var party: IParty, + var enemy1: Enemy, + var enemy2: Enemy, + var enemy3: Enemy, + var enemy4: Enemy, + var enemy5: Enemy) { + +} diff --git a/src/main/scala/unit/IParty.scala b/src/main/scala/unit/IParty.scala new file mode 100644 index 0000000..cbf9d4b --- /dev/null +++ b/src/main/scala/unit/IParty.scala @@ -0,0 +1,5 @@ +package unit + +trait IParty { + +} diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index 89a07af..5b3776b 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -14,7 +14,7 @@ package unit * @since 1.0.0 * @version 1.0.0 */ -class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacter = new DummyCharacter,var member3: ICharacter = new DummyCharacter) { +class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacter = new DummyCharacter,var member3: ICharacter = new DummyCharacter) extends IParty { /** Adds a member to one of the party slots * From 22ded8d397525c8446793664ea9980ac2b2407d9 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Tue, 16 Apr 2024 19:51:37 -0400 Subject: [PATCH 20/36] FEAT Added Programmer Class and tests --- src/main/scala/combatsystem/Programmer.scala | 11 ++--- src/test/scala/combatsystem/CombatTest.scala | 50 ++++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/test/scala/combatsystem/CombatTest.scala diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 0ddb8c7..8771e4b 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -1,11 +1,8 @@ package combatsystem import unit.{Enemy, IParty} +import scala.collection.mutable.ListBuffer class Programmer(var party: IParty, - var enemy1: Enemy, - var enemy2: Enemy, - var enemy3: Enemy, - var enemy4: Enemy, - var enemy5: Enemy) { - -} + val enemies: ListBuffer[Enemy]) { + var k : Int = 3 +} \ No newline at end of file diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala new file mode 100644 index 0000000..60bba40 --- /dev/null +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -0,0 +1,50 @@ +package combatsystem +import profession.{BlackMage, Warrior} +import unit.{Character, EnemyClass, MagicCharacter, Party} +import weapon.{Sword, Wand} + +import scala.collection.mutable.ListBuffer + +class CombatTest extends munit.FunSuite { + var member1 : Character = _ + var member2 : MagicCharacter = _ + var enemy1 : EnemyClass = _ + var enemy2 : EnemyClass = _ + var enemy3 : EnemyClass = _ + var enemy4 : EnemyClass = _ + var enemy5 : EnemyClass = _ + var enemy6 : EnemyClass = _ + var SomeParty : Party = _ + var TestTurns : Programmer = _ + + override def beforeEach(context: BeforeEach): Unit = { + member1 = new Character("Dude",100,5,50,new Warrior) + member1.heldweapon = new Sword("Test",10,12.5,member1) + member2 = new MagicCharacter("Another Dude",100,1,40.25,new BlackMage, 500) + member2.heldweapon = new Wand("Test",10,12.5,member2, 50) + enemy1 = new EnemyClass("Foo",20,10,3,10) + enemy2 = new EnemyClass("Another Foo",30,10,5,10.5) + enemy3 = new EnemyClass("Foo III",45,12,30,12.5) + enemy4 = new EnemyClass("Foo Foo",75,15,15,90.5) + enemy5 = new EnemyClass("Oof",100,25,10,120) + enemy6 = new EnemyClass("FOO",250,100,50,250) + SomeParty = new Party(member1) + TestTurns = new Programmer(SomeParty,ListBuffer(enemy1,enemy2,enemy3)) + } + + test("Programmer Adding Tests"){ + TestTurns.add(member2) + SomeParty.add(member2) + assertEquals(TestTurns.party,SomeParty) + TestTurns.add(enemy4) + assertEquals(TestTurns.enemies(3),enemy4) + TestTurns.add(enemy5) + TestTurns.add(enemy6) + assertEquals(TestTurns.enemies(-1),enemy5) + } + test("Programmer Turns Tests"){ + TestTurns.step() + TestTurns.anyTurn() + TestTurns.getTurn() + } +} From ead7b7a07c04867df0196744bb5077ce13320d59 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 21 Apr 2024 14:16:22 -0400 Subject: [PATCH 21/36] FEAT Added add methods to programmer --- src/main/scala/combatsystem/Programmer.scala | 19 +++++++++++++++---- src/main/scala/unit/IParty.scala | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 8771e4b..314718d 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -1,8 +1,19 @@ package combatsystem -import unit.{Enemy, IParty} +import unit.{Enemy, ICharacter, IParty} + import scala.collection.mutable.ListBuffer -class Programmer(var party: IParty, - val enemies: ListBuffer[Enemy]) { - var k : Int = 3 +class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { + protected var k: Int = 3 + + def add(who: ICharacter): Unit = { + party.add(who) + } + + def add(who: Enemy): Unit = { + if(enemies.length < 5){ + enemies.addOne(who) + } + } + } \ No newline at end of file diff --git a/src/main/scala/unit/IParty.scala b/src/main/scala/unit/IParty.scala index cbf9d4b..30fb935 100644 --- a/src/main/scala/unit/IParty.scala +++ b/src/main/scala/unit/IParty.scala @@ -1,5 +1,5 @@ package unit trait IParty { - + def add(who:ICharacter): Unit } From ee4be6c6f5d6ddef2c6be31da41b534b072319e3 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 21 Apr 2024 14:36:39 -0400 Subject: [PATCH 22/36] FEAT Added actionbar for characters --- src/main/scala/unit/AbstractCharacter.scala | 2 +- src/main/scala/unit/Character.scala | 13 +++++++++++++ src/main/scala/unit/MagicCharacter.scala | 13 +++++++++++++ src/main/scala/unit/Units.scala | 3 +++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 1af22c7..02a1ce7 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -17,7 +17,7 @@ abstract class AbstractCharacter extends ICharacter { * * Starts by default empty, meaning no held weapon. */ - var heldweapon: Weapon = _ + var heldweapon: Weapon = null def isAlive: Boolean = { if (life > 0) true diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index 862ae41..8b325bd 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -24,4 +24,17 @@ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int this(x, l, 0, w, p) } + private var actionbar = 0 + private var maxActionbar: Double = { + if (heldweapon != null) weight + (heldweapon.weight / 2) + else weight + } + + def getActionBar: Double = { + actionbar - maxActionbar + } + + def setActionBar(k: Int): Unit = { + actionbar += k + } } diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index 32f5d3e..ce3f28b 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -25,4 +25,17 @@ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defens this(x, l, 0, w, p, m) } + private var actionbar = 0 + private var maxActionbar: Double = { + if (heldweapon != null) weight + (heldweapon.weight / 2) + else weight + } + + def getActionBar: Double = { + actionbar - maxActionbar + } + + def setActionBar(k: Int): Unit = { + actionbar += k + } } \ No newline at end of file diff --git a/src/main/scala/unit/Units.scala b/src/main/scala/unit/Units.scala index 6e1e12c..9e746af 100644 --- a/src/main/scala/unit/Units.scala +++ b/src/main/scala/unit/Units.scala @@ -17,4 +17,7 @@ trait Units { * @return If the entity is alive */ def isAlive: Boolean + + def getActionBar: Double + def setActionBar(k : Int) : Unit } From bfca82b880c21459ef8063eed21d33d9c2ff3faa Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 21 Apr 2024 14:39:05 -0400 Subject: [PATCH 23/36] FEAT Added actionbar for enemies --- src/main/scala/unit/Enemy.scala | 2 +- src/main/scala/unit/EnemyClass.scala | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/scala/unit/Enemy.scala b/src/main/scala/unit/Enemy.scala index 53fcee6..e255eb4 100644 --- a/src/main/scala/unit/Enemy.scala +++ b/src/main/scala/unit/Enemy.scala @@ -5,5 +5,5 @@ package unit * Used by [[unit.EnemyClass]] */ trait Enemy extends Units{ -var damage: Int + var damage: Int } diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index 900e1ea..ae24f0f 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -19,4 +19,15 @@ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, if (life > 0) true else false } + + private var actionbar = 0 + private var maxActionbar: Double = weight + + def getActionBar: Double = { + actionbar - maxActionbar + } + + def setActionBar(k: Int): Unit = { + actionbar += k + } } From f54fac748e949a1703aad8337d3b226046d6c3bd Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 21 Apr 2024 14:54:55 -0400 Subject: [PATCH 24/36] FEAT Added step method --- src/main/scala/combatsystem/Programmer.scala | 5 +++++ src/main/scala/unit/IParty.scala | 1 + src/main/scala/unit/Party.scala | 12 +++++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 314718d..8009547 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -16,4 +16,9 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { } } + def step() : Unit = { + party.step(k) + for(n <- enemies) n.setActionBar(k) + } + } \ No newline at end of file diff --git a/src/main/scala/unit/IParty.scala b/src/main/scala/unit/IParty.scala index 30fb935..f28b7b3 100644 --- a/src/main/scala/unit/IParty.scala +++ b/src/main/scala/unit/IParty.scala @@ -2,4 +2,5 @@ package unit trait IParty { def add(who:ICharacter): Unit + def step(k : Int): Unit } diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index 5b3776b..c941f24 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -24,9 +24,9 @@ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacte * @param who The character to be added to the party. */ def add(who: ICharacter): Unit = { - if(member1.profession==null)member1=who - else if(member2.profession==null)member2=who - else if(member3.profession==null)member3=who + if (member1.profession == null) member1 = who + else if (member2.profession == null) member2 = who + else if (member3.profession == null) member3 = who } /** Determines if the party is alive. @@ -38,4 +38,10 @@ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacte def isAlive: Boolean = { member1.isAlive || member2.isAlive || member3.isAlive } + + def step(k: Int): Unit = { + if(member1.profession != null) member1.setActionBar(k) + if(member2.profession != null) member2.setActionBar(k) + if(member3.profession != null) member3.setActionBar(k) + } } From 4e0fe65fa4023e8c34cf8702a9080bbf282c31b8 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 21 Apr 2024 15:15:44 -0400 Subject: [PATCH 25/36] FEAT Added anyturn checking method --- src/main/scala/combatsystem/Programmer.scala | 13 ++++++++++++- src/main/scala/unit/DummyCharacter.scala | 4 ++++ src/main/scala/unit/IParty.scala | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 8009547..05cbfd5 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -1,10 +1,11 @@ package combatsystem -import unit.{Enemy, ICharacter, IParty} +import unit.{Enemy, ICharacter, IParty, Units} import scala.collection.mutable.ListBuffer class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { protected var k: Int = 3 + private var readyList : ListBuffer[Units] = ListBuffer() def add(who: ICharacter): Unit = { party.add(who) @@ -21,4 +22,14 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { for(n <- enemies) n.setActionBar(k) } + def anyTurn() : Boolean = { + if(party.member1.getActionBar > 0) readyList.addOne(party.member1) + if(party.member2.getActionBar > 0) readyList.addOne(party.member2) + if(party.member3.getActionBar > 0) readyList.addOne(party.member3) + for(n <- enemies) if(n.getActionBar > 0){ readyList.addOne(n) } + + if(readyList.nonEmpty) true + else false + } + } \ No newline at end of file diff --git a/src/main/scala/unit/DummyCharacter.scala b/src/main/scala/unit/DummyCharacter.scala index 91784d5..7545ef3 100644 --- a/src/main/scala/unit/DummyCharacter.scala +++ b/src/main/scala/unit/DummyCharacter.scala @@ -15,4 +15,8 @@ package unit */ class DummyCharacter extends Character(profession = null) { life = 0 + + override def getActionBar: Double = { + -1 + } } diff --git a/src/main/scala/unit/IParty.scala b/src/main/scala/unit/IParty.scala index f28b7b3..119308d 100644 --- a/src/main/scala/unit/IParty.scala +++ b/src/main/scala/unit/IParty.scala @@ -1,6 +1,9 @@ package unit trait IParty { + var member1 : ICharacter + var member2 : ICharacter + var member3 : ICharacter def add(who:ICharacter): Unit def step(k : Int): Unit } From 0da42762f6170b4e5ce032b93b58398d9726bfa4 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 21 Apr 2024 15:28:18 -0400 Subject: [PATCH 26/36] FEAT Added getTurn method --- src/main/scala/combatsystem/Programmer.scala | 12 ++++++++++-- src/test/scala/combatsystem/CombatTest.scala | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 05cbfd5..8daa085 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -5,7 +5,7 @@ import scala.collection.mutable.ListBuffer class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { protected var k: Int = 3 - private var readyList : ListBuffer[Units] = ListBuffer() + private val readyList : ListBuffer[Units] = ListBuffer() def add(who: ICharacter): Unit = { party.add(who) @@ -22,7 +22,8 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { for(n <- enemies) n.setActionBar(k) } - def anyTurn() : Boolean = { + def anyTurn : Boolean = { + readyList.empty if(party.member1.getActionBar > 0) readyList.addOne(party.member1) if(party.member2.getActionBar > 0) readyList.addOne(party.member2) if(party.member3.getActionBar > 0) readyList.addOne(party.member3) @@ -32,4 +33,11 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { else false } + def getTurn : Units = { + readyList.sortBy(_.getActionBar) //ordered from left to right in ascending order + val result : Units = readyList(-1) + readyList.remove(-1) + result + } + } \ No newline at end of file diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala index 60bba40..1e7ad3f 100644 --- a/src/test/scala/combatsystem/CombatTest.scala +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -44,7 +44,7 @@ class CombatTest extends munit.FunSuite { } test("Programmer Turns Tests"){ TestTurns.step() - TestTurns.anyTurn() - TestTurns.getTurn() + TestTurns.anyTurn + TestTurns.getTurn } } From 9f42b4ebed8d3fc5a63f91f1658ef64f644a001f Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sun, 21 Apr 2024 15:31:53 -0400 Subject: [PATCH 27/36] FEAT Added setting actionbar back to zero --- src/main/scala/combatsystem/Programmer.scala | 1 + src/main/scala/unit/Character.scala | 3 ++- src/main/scala/unit/EnemyClass.scala | 3 ++- src/main/scala/unit/MagicCharacter.scala | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 8daa085..d6e8748 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -36,6 +36,7 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { def getTurn : Units = { readyList.sortBy(_.getActionBar) //ordered from left to right in ascending order val result : Units = readyList(-1) + result.setActionBar(0) readyList.remove(-1) result } diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index 8b325bd..6c6bb96 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -35,6 +35,7 @@ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int } def setActionBar(k: Int): Unit = { - actionbar += k + if(k != 0) actionbar += k + else actionbar = 0 } } diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index ae24f0f..8caff90 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -28,6 +28,7 @@ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, } def setActionBar(k: Int): Unit = { - actionbar += k + if(k != 0) actionbar += k + else actionbar = 0 } } diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index ce3f28b..6b35119 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -36,6 +36,7 @@ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defens } def setActionBar(k: Int): Unit = { - actionbar += k + if(k != 0) actionbar += k + else actionbar = 0 } } \ No newline at end of file From 9cac4ca5088663ed3fd9d6301a84a422d5dcb257 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Mon, 22 Apr 2024 21:48:46 -0400 Subject: [PATCH 28/36] FEAT Added last touchs for finding and getting turns --- src/main/scala/combatsystem/Programmer.scala | 20 +++++++++++++------- src/main/scala/unit/Character.scala | 2 +- src/main/scala/unit/DummyCharacter.scala | 2 ++ src/main/scala/unit/EnemyClass.scala | 5 ++--- src/main/scala/unit/MagicCharacter.scala | 2 +- src/main/scala/unit/Party.scala | 6 +++--- src/test/scala/combatsystem/CombatTest.scala | 19 ++++++++++++++----- 7 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index d6e8748..5ad4a1e 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -5,15 +5,19 @@ import scala.collection.mutable.ListBuffer class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { protected var k: Int = 3 - private val readyList : ListBuffer[Units] = ListBuffer() + private var readyList : ListBuffer[Units] = ListBuffer() + party.step(0) + for(n <- enemies) n.setActionBar(0) def add(who: ICharacter): Unit = { party.add(who) + who.setActionBar(0) } def add(who: Enemy): Unit = { if(enemies.length < 5){ enemies.addOne(who) + who.setActionBar(0) } } @@ -23,21 +27,23 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { } def anyTurn : Boolean = { - readyList.empty + readyList.clear() if(party.member1.getActionBar > 0) readyList.addOne(party.member1) if(party.member2.getActionBar > 0) readyList.addOne(party.member2) if(party.member3.getActionBar > 0) readyList.addOne(party.member3) - for(n <- enemies) if(n.getActionBar > 0){ readyList.addOne(n) } + for(n <- enemies){ + if(n.getActionBar > 0) readyList.addOne(n) + } if(readyList.nonEmpty) true else false } def getTurn : Units = { - readyList.sortBy(_.getActionBar) //ordered from left to right in ascending order - val result : Units = readyList(-1) - result.setActionBar(0) - readyList.remove(-1) + readyList = readyList.sortWith(_.getActionBar < _.getActionBar) + val result : Units = readyList.last + readyList.last.setActionBar(0) + readyList.dropRightInPlace(1) result } diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index 6c6bb96..ef22071 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -24,7 +24,7 @@ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int this(x, l, 0, w, p) } - private var actionbar = 0 + private var actionbar : Double = 0 private var maxActionbar: Double = { if (heldweapon != null) weight + (heldweapon.weight / 2) else weight diff --git a/src/main/scala/unit/DummyCharacter.scala b/src/main/scala/unit/DummyCharacter.scala index 7545ef3..96ceb84 100644 --- a/src/main/scala/unit/DummyCharacter.scala +++ b/src/main/scala/unit/DummyCharacter.scala @@ -19,4 +19,6 @@ class DummyCharacter extends Character(profession = null) { override def getActionBar: Double = { -1 } + + override def setActionBar(k: Int): Unit = { } } diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index 8caff90..63c696d 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -20,11 +20,10 @@ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, else false } - private var actionbar = 0 - private var maxActionbar: Double = weight + private var actionbar : Double = 0 def getActionBar: Double = { - actionbar - maxActionbar + actionbar - weight } def setActionBar(k: Int): Unit = { diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index 6b35119..802c485 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -25,7 +25,7 @@ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defens this(x, l, 0, w, p, m) } - private var actionbar = 0 + private var actionbar : Double = 0 private var maxActionbar: Double = { if (heldweapon != null) weight + (heldweapon.weight / 2) else weight diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index c941f24..f875291 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -40,8 +40,8 @@ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacte } def step(k: Int): Unit = { - if(member1.profession != null) member1.setActionBar(k) - if(member2.profession != null) member2.setActionBar(k) - if(member3.profession != null) member3.setActionBar(k) + member1.setActionBar(k) + member2.setActionBar(k) + member3.setActionBar(k) } } diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala index 1e7ad3f..8c3eb98 100644 --- a/src/test/scala/combatsystem/CombatTest.scala +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -18,11 +18,11 @@ class CombatTest extends munit.FunSuite { var TestTurns : Programmer = _ override def beforeEach(context: BeforeEach): Unit = { - member1 = new Character("Dude",100,5,50,new Warrior) + member1 = new Character("Dude",100,5,50.0,new Warrior) member1.heldweapon = new Sword("Test",10,12.5,member1) member2 = new MagicCharacter("Another Dude",100,1,40.25,new BlackMage, 500) member2.heldweapon = new Wand("Test",10,12.5,member2, 50) - enemy1 = new EnemyClass("Foo",20,10,3,10) + enemy1 = new EnemyClass("Foo",20,10,3,10.0) enemy2 = new EnemyClass("Another Foo",30,10,5,10.5) enemy3 = new EnemyClass("Foo III",45,12,30,12.5) enemy4 = new EnemyClass("Foo Foo",75,15,15,90.5) @@ -40,11 +40,20 @@ class CombatTest extends munit.FunSuite { assertEquals(TestTurns.enemies(3),enemy4) TestTurns.add(enemy5) TestTurns.add(enemy6) - assertEquals(TestTurns.enemies(-1),enemy5) + assertEquals(TestTurns.enemies.last,enemy5) } test("Programmer Turns Tests"){ + TestTurns.add(member2) TestTurns.step() - TestTurns.anyTurn - TestTurns.getTurn + if(TestTurns.anyTurn) TestTurns.getTurn + assertEquals(TestTurns.anyTurn,false) + for(i <- 0 to 50) TestTurns.step() + assertEquals(TestTurns.anyTurn,true) + if(TestTurns.anyTurn) assertEquals(TestTurns.getTurn,enemy1) + if(TestTurns.anyTurn) assertEquals(TestTurns.getTurn,enemy2) + if(TestTurns.anyTurn) assertEquals(TestTurns.getTurn,enemy3) + if(TestTurns.anyTurn) assertEquals(TestTurns.getTurn,member2) + if(TestTurns.anyTurn) assertEquals(TestTurns.getTurn,member1) + assertEquals(TestTurns.anyTurn,false) } } From b2af248913d8a294024fb3b148d6fb83be1a8074 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Mon, 22 Apr 2024 22:13:54 -0400 Subject: [PATCH 29/36] FEAT Added remove method for party and programmer --- src/main/scala/combatsystem/Programmer.scala | 36 ++++++++++++-------- src/main/scala/unit/IParty.scala | 2 ++ src/main/scala/unit/Party.scala | 6 ++++ src/test/scala/combatsystem/CombatTest.scala | 10 ++++-- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 5ad4a1e..c26d5a0 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -5,9 +5,9 @@ import scala.collection.mutable.ListBuffer class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { protected var k: Int = 3 - private var readyList : ListBuffer[Units] = ListBuffer() + private var readyList: ListBuffer[Units] = ListBuffer() party.step(0) - for(n <- enemies) n.setActionBar(0) + for (n <- enemies) n.setActionBar(0) def add(who: ICharacter): Unit = { party.add(who) @@ -15,33 +15,41 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { } def add(who: Enemy): Unit = { - if(enemies.length < 5){ + if (enemies.length < 5) { enemies.addOne(who) who.setActionBar(0) } } - def step() : Unit = { + def remove(who: ICharacter): Unit = { + party.remove(who) + } + + def remove(who: Enemy): Unit = { + enemies -= who + } + + def step(): Unit = { party.step(k) - for(n <- enemies) n.setActionBar(k) + for (n <- enemies) n.setActionBar(k) } - def anyTurn : Boolean = { + def anyTurn: Boolean = { readyList.clear() - if(party.member1.getActionBar > 0) readyList.addOne(party.member1) - if(party.member2.getActionBar > 0) readyList.addOne(party.member2) - if(party.member3.getActionBar > 0) readyList.addOne(party.member3) - for(n <- enemies){ - if(n.getActionBar > 0) readyList.addOne(n) + if (party.member1.getActionBar > 0) readyList.addOne(party.member1) + if (party.member2.getActionBar > 0) readyList.addOne(party.member2) + if (party.member3.getActionBar > 0) readyList.addOne(party.member3) + for (n <- enemies) { + if (n.getActionBar > 0) readyList.addOne(n) } - if(readyList.nonEmpty) true + if (readyList.nonEmpty) true else false } - def getTurn : Units = { + def getTurn: Units = { readyList = readyList.sortWith(_.getActionBar < _.getActionBar) - val result : Units = readyList.last + val result: Units = readyList.last readyList.last.setActionBar(0) readyList.dropRightInPlace(1) result diff --git a/src/main/scala/unit/IParty.scala b/src/main/scala/unit/IParty.scala index 119308d..d9588a0 100644 --- a/src/main/scala/unit/IParty.scala +++ b/src/main/scala/unit/IParty.scala @@ -6,4 +6,6 @@ trait IParty { var member3 : ICharacter def add(who:ICharacter): Unit def step(k : Int): Unit + + def remove(who:ICharacter):Unit } diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index f875291..5c0d7a9 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -44,4 +44,10 @@ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacte member2.setActionBar(k) member3.setActionBar(k) } + + def remove(who:ICharacter):Unit={ + if(who==member3) member3 = new DummyCharacter + if(who==member2) member2 = new DummyCharacter + if(who==member1) member1 = new DummyCharacter + } } diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala index 8c3eb98..7f42d4f 100644 --- a/src/test/scala/combatsystem/CombatTest.scala +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -1,6 +1,6 @@ package combatsystem import profession.{BlackMage, Warrior} -import unit.{Character, EnemyClass, MagicCharacter, Party} +import unit.{Character, Enemy, EnemyClass, MagicCharacter, Party} import weapon.{Sword, Wand} import scala.collection.mutable.ListBuffer @@ -29,10 +29,10 @@ class CombatTest extends munit.FunSuite { enemy5 = new EnemyClass("Oof",100,25,10,120) enemy6 = new EnemyClass("FOO",250,100,50,250) SomeParty = new Party(member1) - TestTurns = new Programmer(SomeParty,ListBuffer(enemy1,enemy2,enemy3)) + TestTurns = new Programmer(SomeParty,ListBuffer[Enemy](enemy1,enemy2,enemy3)) } - test("Programmer Adding Tests"){ + test("Programmer Adding and removing Tests"){ TestTurns.add(member2) SomeParty.add(member2) assertEquals(TestTurns.party,SomeParty) @@ -41,6 +41,10 @@ class CombatTest extends munit.FunSuite { TestTurns.add(enemy5) TestTurns.add(enemy6) assertEquals(TestTurns.enemies.last,enemy5) + TestTurns.remove(member1) + assertEquals(TestTurns.party.member1.profession,null) + TestTurns.remove(enemy3) + assertEquals(TestTurns.enemies,ListBuffer[Enemy](enemy1,enemy2,enemy4,enemy5)) } test("Programmer Turns Tests"){ TestTurns.add(member2) From 4e4617348838feb9d020fb92b305b8f2efadffde Mon Sep 17 00:00:00 2001 From: JTJetc Date: Mon, 22 Apr 2024 23:14:41 -0400 Subject: [PATCH 30/36] DOC Added more documentation --- README.md | 14 ++++-- src/main/scala/combatsystem/Programmer.scala | 50 ++++++++++++++++++-- src/main/scala/unit/AbstractCharacter.scala | 2 +- src/main/scala/unit/Character.scala | 14 +++++- src/main/scala/unit/EnemyClass.scala | 12 ++++- src/main/scala/unit/IParty.scala | 3 ++ src/main/scala/unit/MagicCharacter.scala | 14 +++++- src/main/scala/unit/Party.scala | 10 +++- 8 files changed, 104 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 15bf23e..5fb8f11 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Final Reality -Final Reality is a simplified clone of the renowned game, Final Fantasy. Its main purpose is to +>Final Reality is a simplified clone of the renowned game, Final Fantasy. Its main purpose is to serve as an educational tool, teaching foundational programming concepts. -This README is yours to complete it. Take this opportunity to describe your contributions, the -design decisions you've made, and any other information you deem necessary. +*This README is yours to complete it. Take this opportunity to describe your contributions, the +design decisions you've made, and any other information you deem necessary.* ## 1° Assigment ### Partial Assigment 1 @@ -20,7 +20,13 @@ is alive, and can add members up to three. constructor, which will be easier to compare later. - Weapon trait for common attributes, and two abstract classes for common and magic weapons with magic damage. - Tests with munit.FunSuite, mainly of constructors, making sure to have good coverage. - +### Partial Assigment 2 +- Programmer class in charge to manage actionbar changes and determining which enemy or character can get a turn +- Programmer can add and remove units (max 3 party members, max 5 enemies per battle) +- Programmer for now has an arbitrary amount k to increase the actionbar each step +- They ideal combat manager will step the programmer, then ask if any member can perform a turn, and if true, +perform an action with returned unit, otherwise keep stepping to increase actionbars +- Maybe one programmer object can be used for each different battle, making sure to destroy the leftover object This project is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index c26d5a0..9a3027d 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -3,17 +3,41 @@ import unit.{Enemy, ICharacter, IParty, Units} import scala.collection.mutable.ListBuffer +/** Class representing a programmer of turns. + * + * Uses a [[unit.Party]] and a ListBuffer type [[unit.Enemy]] to up to 5 enemies, has many methods to ask and change the actionbar of the units, and then retrieve who could perform an action + * + * @param party A Party of Characters + * @param enemies A ListBuffer of enemies + * + * @constructor Creates a new programmer for turns checking. + * + * @author Javier Torres + * @since 1.0.0 + * @version 1.0.0 + */ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { + /**An arbitrary amount to increase the actionbar*/ protected var k: Int = 3 - private var readyList: ListBuffer[Units] = ListBuffer() + /**A ListBuffer to save the units that have completed their actionbars and can perform a turn, initialized empty*/ + private var readyList: ListBuffer[Units] = ListBuffer() //required to be var because otherwise cant be sorted + //When the constructors builds, make sure to set all units actionbar to zero in case they already had some from another battle party.step(0) for (n <- enemies) n.setActionBar(0) + /** Adds a Character to the programmer, who then makes sure add to the party and set its actionbar to zero + * + * @param who The character to add to the programmer + */ def add(who: ICharacter): Unit = { party.add(who) who.setActionBar(0) } + /** Adds an enemy to the programmer, who then makes sure add to the ListBuffer and set its actionbar to zero. + * Can only add an enemy if there is space (max 5 enemies) + * @param who The enemy to add to the programmer + */ def add(who: Enemy): Unit = { if (enemies.length < 5) { enemies.addOne(who) @@ -21,20 +45,34 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { } } + /** Removes a specific character from the programmer, who makes sure to remove it from the party too + * + * @param who The character to remove from the programmer + */ def remove(who: ICharacter): Unit = { party.remove(who) } + /** Removes a specific enemy from the programmer + * + * @param who The enemy to remove from the programmer + */ def remove(who: Enemy): Unit = { enemies -= who } + /** Method to make progress in the actionbar on each party member and enemy in the ListBuffer*/ def step(): Unit = { party.step(k) for (n <- enemies) n.setActionBar(k) } + /** Checks all the units actionbars, and if they completed it, gets added to readyList ListBuffer + * + * @return True if any unit can perform a turn + */ def anyTurn: Boolean = { + //First clears the list to avoid duplicates readyList.clear() if (party.member1.getActionBar > 0) readyList.addOne(party.member1) if (party.member2.getActionBar > 0) readyList.addOne(party.member2) @@ -42,14 +80,18 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { for (n <- enemies) { if (n.getActionBar > 0) readyList.addOne(n) } - + //If at least one unit in list, someone can perform a turn, then returns true if (readyList.nonEmpty) true else false } + /**Sorts the readyList by actionbar, then extracts the one unit with more excess and resets its actionbar to zero + * + * @return The character or enemy that can perform an action, prioritizing the one with more excess actionbar + */ def getTurn: Units = { - readyList = readyList.sortWith(_.getActionBar < _.getActionBar) - val result: Units = readyList.last + readyList = readyList.sortWith(_.getActionBar < _.getActionBar) //this way, the last one in list is the one with priority to have a turn + val result: Units = readyList.last //character or enemy to return readyList.last.setActionBar(0) readyList.dropRightInPlace(1) result diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 02a1ce7..00a1c5c 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -10,7 +10,7 @@ import weapon.Weapon * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ abstract class AbstractCharacter extends ICharacter { /** The weapon this character is holding. diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index ef22071..db519fa 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -16,24 +16,34 @@ import profession.Profession * * @author Javier Torres * @since 1.0.0 - * @version 1.0.1 + * @version 1.0.2 */ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession:Profession) extends AbstractCharacter { /** Alternative constructor if one where to skip defense, defaulting it to 0 */ def this(x: String, l: Int, w: Double, p: Profession) = { this(x, l, 0, w, p) } - + /**The actionbar of the character, starts at zero*/ private var actionbar : Double = 0 + /**The threshold to complete to consider a complete actionbar and be able to get a turn*/ private var maxActionbar: Double = { if (heldweapon != null) weight + (heldweapon.weight / 2) else weight } + /** Method that compares actionbar with maxActionbar + * + * @return The difference between actionbar and maxActionbar + */ def getActionBar: Double = { actionbar - maxActionbar } + /** Method that adds k to character action bar. + * In case k = 0, actionbar goes back to zero. + * + * @param k Amount to change actionbar + */ def setActionBar(k: Int): Unit = { if(k != 0) actionbar += k else actionbar = 0 diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index 63c696d..78a3360 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -12,7 +12,7 @@ package unit * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.2 */ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, val weight:Double) extends Enemy{ def isAlive: Boolean = { @@ -20,12 +20,22 @@ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, else false } + /**The actionbar of the enemy, starts at zero*/ private var actionbar : Double = 0 + /** Method that compares actionbar with weight + * + * @return The difference between actionbar and weight + */ def getActionBar: Double = { actionbar - weight } + /** Method that adds k to enemy action bar. + * In case k = 0, actionbar goes back to zero. + * + * @param k Amount to change actionbar + */ def setActionBar(k: Int): Unit = { if(k != 0) actionbar += k else actionbar = 0 diff --git a/src/main/scala/unit/IParty.scala b/src/main/scala/unit/IParty.scala index d9588a0..8d5dfcb 100644 --- a/src/main/scala/unit/IParty.scala +++ b/src/main/scala/unit/IParty.scala @@ -1,5 +1,8 @@ package unit +/** Trait mainly used for type checking. + * Used by [[unit.Party]] + */ trait IParty { var member1 : ICharacter var member2 : ICharacter diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index 802c485..52a8548 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -17,24 +17,34 @@ import profession.Profession * * @author Javier Torres * @since 1.0.0 - * @version 1.0.1 + * @version 1.0.2 */ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defense: Int = 0, val weight: Double = 0.1, val profession: Profession, var mana:Int=0) extends AbstractCharacter { /** Alternative constructor if one where to skip defense, defaulting it to 0 */ def this(x: String, l: Int, w: Double, p: Profession, m: Int) = { this(x, l, 0, w, p, m) } - + /**The actionbar of the character, starts at zero*/ private var actionbar : Double = 0 + /**The threshold to complete to consider a complete actionbar and be able to get a turn*/ private var maxActionbar: Double = { if (heldweapon != null) weight + (heldweapon.weight / 2) else weight } + /** Method that compares actionbar with maxActionbar + * + * @return The difference between actionbar and maxActionbar + */ def getActionBar: Double = { actionbar - maxActionbar } + /** Method that adds k to character action bar. + * In case k = 0, actionbar goes back to zero. + * + * @param k Amount to change actionbar + */ def setActionBar(k: Int): Unit = { if(k != 0) actionbar += k else actionbar = 0 diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index 5c0d7a9..7f795b8 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -12,7 +12,7 @@ package unit * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.2 */ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacter = new DummyCharacter,var member3: ICharacter = new DummyCharacter) extends IParty { @@ -39,12 +39,20 @@ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacte member1.isAlive || member2.isAlive || member3.isAlive } + /** Changes the actionbar of each party member by a k amount + * + * @param k Amount to change the actionbar + */ def step(k: Int): Unit = { member1.setActionBar(k) member2.setActionBar(k) member3.setActionBar(k) } + /** Removes a specific member from the party + * + * @param who The Character to remove from the party + */ def remove(who:ICharacter):Unit={ if(who==member3) member3 = new DummyCharacter if(who==member2) member2 = new DummyCharacter From e5034d6fa03a73ad70cb1e4d60349f8ab60ae34d Mon Sep 17 00:00:00 2001 From: JTJetc Date: Thu, 25 Apr 2024 14:58:24 -0400 Subject: [PATCH 31/36] Branch creation --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5fb8f11..df7cc51 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ constructor, which will be easier to compare later. - They ideal combat manager will step the programmer, then ask if any member can perform a turn, and if true, perform an action with returned unit, otherwise keep stepping to increase actionbars - Maybe one programmer object can be used for each different battle, making sure to destroy the leftover object +### Final Assigment +- Pending This project is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file From 327833cbcd8859a53cca4808fa483793e721fa04 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 11 May 2024 18:45:15 -0400 Subject: [PATCH 32/36] Added Privatization --- README.md | 3 +- src/main/scala/combatsystem/Programmer.scala | 30 ++++++++++++++------ src/main/scala/unit/AbstractCharacter.scala | 6 ++++ src/main/scala/unit/Character.scala | 15 ++++++++-- src/main/scala/unit/DummyCharacter.scala | 6 ++-- src/main/scala/unit/Enemy.scala | 4 ++- src/main/scala/unit/EnemyClass.scala | 14 +++++++-- src/main/scala/unit/ICharacter.scala | 4 +++ src/main/scala/unit/IParty.scala | 11 ++++--- src/main/scala/unit/MagicCharacter.scala | 21 ++++++++++++-- src/main/scala/unit/Party.scala | 30 ++++++++++++++++++-- src/main/scala/unit/Units.scala | 9 ++++-- src/main/scala/weapon/Axe.scala | 7 +++-- src/main/scala/weapon/Bow.scala | 7 +++-- src/main/scala/weapon/Staff.scala | 8 ++++-- src/main/scala/weapon/Sword.scala | 7 +++-- src/main/scala/weapon/Wand.scala | 8 ++++-- src/main/scala/weapon/Weapon.scala | 2 +- src/test/scala/combatsystem/CombatTest.scala | 10 +++---- src/test/scala/unit/CharacterTest.scala | 23 ++++++++------- 20 files changed, 165 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index df7cc51..1c75316 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ constructor, which will be easier to compare later. perform an action with returned unit, otherwise keep stepping to increase actionbars - Maybe one programmer object can be used for each different battle, making sure to destroy the leftover object ### Final Assigment -- Pending +- Started the privatization of values and methods, making sure that var type values where at least protected, while +val types can be public. And added methods to view some now private or protected values. This project is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file diff --git a/src/main/scala/combatsystem/Programmer.scala b/src/main/scala/combatsystem/Programmer.scala index 9a3027d..de15ef4 100644 --- a/src/main/scala/combatsystem/Programmer.scala +++ b/src/main/scala/combatsystem/Programmer.scala @@ -5,7 +5,7 @@ import scala.collection.mutable.ListBuffer /** Class representing a programmer of turns. * - * Uses a [[unit.Party]] and a ListBuffer type [[unit.Enemy]] to up to 5 enemies, has many methods to ask and change the actionbar of the units, and then retrieve who could perform an action + * Uses a [[unit.Party]] and a ListBuffer type [[unit.Enemy]] to up to 5 enemies, has many methods to ask and change the actionbar of the units, and then check and retrieve who could perform an action * * @param party A Party of Characters * @param enemies A ListBuffer of enemies @@ -14,9 +14,9 @@ import scala.collection.mutable.ListBuffer * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ -class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { +class Programmer(private var party: IParty, private val enemies: ListBuffer[Enemy]) { /**An arbitrary amount to increase the actionbar*/ protected var k: Int = 3 /**A ListBuffer to save the units that have completed their actionbars and can perform a turn, initialized empty*/ @@ -72,13 +72,10 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { * @return True if any unit can perform a turn */ def anyTurn: Boolean = { - //First clears the list to avoid duplicates - readyList.clear() - if (party.member1.getActionBar > 0) readyList.addOne(party.member1) - if (party.member2.getActionBar > 0) readyList.addOne(party.member2) - if (party.member3.getActionBar > 0) readyList.addOne(party.member3) + readyList.clear() //First clears the list to avoid duplicates + readyList = party.anyTurnForProgrammer(readyList) for (n <- enemies) { - if (n.getActionBar > 0) readyList.addOne(n) + if (n.getActionBar >= 0) readyList.addOne(n) //Check getActionBar in EnemyClass for more details } //If at least one unit in list, someone can perform a turn, then returns true if (readyList.nonEmpty) true @@ -97,4 +94,19 @@ class Programmer(var party: IParty, val enemies: ListBuffer[Enemy]) { result } + /** Gets the stored party + * + * @return The Programmer's Party + */ + def getParty: IParty = { + party + } + + /** Gets the stored enemies + * + * @return The Programmer's Enemies List + */ + def getEnemies: ListBuffer[Enemy] = { + enemies + } } \ No newline at end of file diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 00a1c5c..345f5cd 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -24,4 +24,10 @@ abstract class AbstractCharacter extends ICharacter { else false } + def getLife: Int = { + life + } + def getDefense: Int ={ + defense + } } diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index db519fa..3bfa555 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -16,9 +16,13 @@ import profession.Profession * * @author Javier Torres * @since 1.0.0 - * @version 1.0.2 + * @version 1.0.3 */ -class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int = 0,val weight: Double = 0.1,val profession:Profession) extends AbstractCharacter { +class Character(val name: String = "Unknown", + protected var life: Int = 0, + protected var defense: Int = 0, + val weight: Double = 0.1, + val profession:Profession) extends AbstractCharacter { /** Alternative constructor if one where to skip defense, defaulting it to 0 */ def this(x: String, l: Int, w: Double, p: Profession) = { this(x, l, 0, w, p) @@ -31,9 +35,14 @@ class Character(val name: String = "Unknown",var life: Int = 0,var defense: Int else weight } + def updateMaxActionbar() : Unit = { //make sure when you could equip a weapon, to update maxActionBar + if (heldweapon != null) maxActionbar = weight + (heldweapon.weight / 2) + else maxActionbar = weight + } + /** Method that compares actionbar with maxActionbar * - * @return The difference between actionbar and maxActionbar + * @return The difference between actionbar and maxActionbar, the excess must be greater or equal to zero */ def getActionBar: Double = { actionbar - maxActionbar diff --git a/src/main/scala/unit/DummyCharacter.scala b/src/main/scala/unit/DummyCharacter.scala index 96ceb84..f528c21 100644 --- a/src/main/scala/unit/DummyCharacter.scala +++ b/src/main/scala/unit/DummyCharacter.scala @@ -11,14 +11,14 @@ package unit * @constructor Creates a new Dummy. * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ class DummyCharacter extends Character(profession = null) { life = 0 - override def getActionBar: Double = { + override def getActionBar: Double = { //so that it never can get a turn -1 } - override def setActionBar(k: Int): Unit = { } + override def setActionBar(k: Int): Unit = { } //does nothing for no turn progress } diff --git a/src/main/scala/unit/Enemy.scala b/src/main/scala/unit/Enemy.scala index e255eb4..649e6e2 100644 --- a/src/main/scala/unit/Enemy.scala +++ b/src/main/scala/unit/Enemy.scala @@ -5,5 +5,7 @@ package unit * Used by [[unit.EnemyClass]] */ trait Enemy extends Units{ - var damage: Int + protected var damage: Int + /** Returns the damage value of the enemy */ + def getDamage: Int } diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index 78a3360..3ae9e30 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -12,9 +12,13 @@ package unit * * @author Javier Torres * @since 1.0.0 - * @version 1.0.2 + * @version 1.0.3 */ -class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, val weight:Double) extends Enemy{ +class EnemyClass(val name: String, + protected var life:Int, + protected var damage:Int, + protected var defense:Int, + val weight:Double) extends Enemy{ def isAlive: Boolean = { if (life > 0) true else false @@ -25,7 +29,7 @@ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, /** Method that compares actionbar with weight * - * @return The difference between actionbar and weight + * @return The difference between actionbar and weight; the excess must be greater or equal to zero */ def getActionBar: Double = { actionbar - weight @@ -40,4 +44,8 @@ class EnemyClass(val name: String,var life:Int, var damage:Int, var defense:Int, if(k != 0) actionbar += k else actionbar = 0 } + + def getLife: Int = life + def getDamage: Int = damage + def getDefense: Int = defense } diff --git a/src/main/scala/unit/ICharacter.scala b/src/main/scala/unit/ICharacter.scala index 3bdd30c..bb4ba77 100644 --- a/src/main/scala/unit/ICharacter.scala +++ b/src/main/scala/unit/ICharacter.scala @@ -7,4 +7,8 @@ import profession.Profession */ trait ICharacter extends Units{ val profession:Profession + + /** Updates the maxActionbar to the correct value */ + def updateMaxActionbar() : Unit + } diff --git a/src/main/scala/unit/IParty.scala b/src/main/scala/unit/IParty.scala index 8d5dfcb..7a2b199 100644 --- a/src/main/scala/unit/IParty.scala +++ b/src/main/scala/unit/IParty.scala @@ -1,14 +1,17 @@ package unit +import scala.collection.mutable.ListBuffer + /** Trait mainly used for type checking. * Used by [[unit.Party]] */ trait IParty { - var member1 : ICharacter - var member2 : ICharacter - var member3 : ICharacter + protected var member1 : ICharacter + protected var member2 : ICharacter + protected var member3 : ICharacter def add(who:ICharacter): Unit def step(k : Int): Unit - def remove(who:ICharacter):Unit + def anyTurnForProgrammer(inlist:ListBuffer[Units]): ListBuffer[Units] + def getMembers : ListBuffer[ICharacter] } diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index 52a8548..951b6c5 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -17,9 +17,14 @@ import profession.Profession * * @author Javier Torres * @since 1.0.0 - * @version 1.0.2 + * @version 1.0.3 */ -class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defense: Int = 0, val weight: Double = 0.1, val profession: Profession, var mana:Int=0) extends AbstractCharacter { +class MagicCharacter(val name: String = "Unknown", + protected var life: Int = 0, + protected var defense: Int = 0, + val weight: Double = 0.1, + val profession: Profession, + private var mana:Int=0) extends AbstractCharacter { /** Alternative constructor if one where to skip defense, defaulting it to 0 */ def this(x: String, l: Int, w: Double, p: Profession, m: Int) = { this(x, l, 0, w, p, m) @@ -32,9 +37,14 @@ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defens else weight } + def updateMaxActionbar() : Unit = { //make sure when you could equip a weapon, to update maxActionBar + if (heldweapon != null) maxActionbar = weight + (heldweapon.weight / 2) + else maxActionbar = weight + } + /** Method that compares actionbar with maxActionbar * - * @return The difference between actionbar and maxActionbar + * @return The difference between actionbar and maxActionbar, the excess must be greater or equal to zero */ def getActionBar: Double = { actionbar - maxActionbar @@ -49,4 +59,9 @@ class MagicCharacter(val name: String = "Unknown", var life: Int = 0, var defens if(k != 0) actionbar += k else actionbar = 0 } + + /** Returns the mana of the character */ + def getMana: Int = { + mana + } } \ No newline at end of file diff --git a/src/main/scala/unit/Party.scala b/src/main/scala/unit/Party.scala index 7f795b8..f7c56bc 100644 --- a/src/main/scala/unit/Party.scala +++ b/src/main/scala/unit/Party.scala @@ -1,5 +1,7 @@ package unit +import scala.collection.mutable.ListBuffer + /** Class representing a Party. * * When initializing, the slots get filled with dummy characters if no character is inputted. @@ -7,14 +9,14 @@ package unit * @param member1 The first member in party. * @param member2 The second member in party. * @param member3 The third member in party. - * * @constructor Creates a new Party. - * * @author Javier Torres * @since 1.0.0 * @version 1.0.2 */ -class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacter = new DummyCharacter,var member3: ICharacter = new DummyCharacter) extends IParty { +class Party(protected var member1: ICharacter = new DummyCharacter, + protected var member2: ICharacter = new DummyCharacter, + protected var member3: ICharacter = new DummyCharacter) extends IParty { /** Adds a member to one of the party slots * @@ -58,4 +60,26 @@ class Party(var member1: ICharacter = new DummyCharacter, var member2: ICharacte if(who==member2) member2 = new DummyCharacter if(who==member1) member1 = new DummyCharacter } + + /** Using a private list in the programmer, this checks and delivers an updated list with party members with + * filled action bars, by checking excess if it is positive (check getActionBar in Character or MagicCharacter for more details) + * + * @param inlist A ListBuffer with units delivered by the programmer + * @return + */ + def anyTurnForProgrammer(inlist:ListBuffer[Units]): ListBuffer[Units] ={ + if (member1.getActionBar >= 0) inlist.addOne(member1) + if (member2.getActionBar >= 0) inlist.addOne(member2) + if (member3.getActionBar >= 0) inlist.addOne(member3) + inlist + } + + /** Returns a ListBuffer with the Party Members */ + def getMembers : ListBuffer[ICharacter] = { + val memberList = new ListBuffer[ICharacter] + memberList += member1 + memberList += member2 + memberList += member3 + memberList + } } diff --git a/src/main/scala/unit/Units.scala b/src/main/scala/unit/Units.scala index 9e746af..40f8e5d 100644 --- a/src/main/scala/unit/Units.scala +++ b/src/main/scala/unit/Units.scala @@ -6,8 +6,8 @@ package unit */ trait Units { val name: String - var life: Int - var defense: Int + protected var life: Int + protected var defense: Int val weight: Double /** Determines if the current entity is alive. @@ -17,7 +17,10 @@ trait Units { * @return If the entity is alive */ def isAlive: Boolean - def getActionBar: Double def setActionBar(k : Int) : Unit + /** Returns the life of the unit */ + def getLife : Int + /** Returns the defense of the unit */ + def getDefense : Int } diff --git a/src/main/scala/weapon/Axe.scala b/src/main/scala/weapon/Axe.scala index 5f35132..04e4626 100644 --- a/src/main/scala/weapon/Axe.scala +++ b/src/main/scala/weapon/Axe.scala @@ -15,8 +15,11 @@ import unit.ICharacter * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ -class Axe(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { +class Axe(val name:String, + val damage:Int, + val weight:Double, + protected var owner:ICharacter) extends AbstractCommonWeapon { } diff --git a/src/main/scala/weapon/Bow.scala b/src/main/scala/weapon/Bow.scala index 4be6a69..8779753 100644 --- a/src/main/scala/weapon/Bow.scala +++ b/src/main/scala/weapon/Bow.scala @@ -15,8 +15,11 @@ import unit.ICharacter * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ -class Bow(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { +class Bow(val name:String, + val damage:Int, + val weight:Double, + protected var owner:ICharacter) extends AbstractCommonWeapon { } diff --git a/src/main/scala/weapon/Staff.scala b/src/main/scala/weapon/Staff.scala index fe2bcb7..25e3d91 100644 --- a/src/main/scala/weapon/Staff.scala +++ b/src/main/scala/weapon/Staff.scala @@ -16,8 +16,12 @@ import unit.ICharacter * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ -class Staff(val name:String, val damage:Int, val weight:Double, var owner:ICharacter, magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { +class Staff(val name:String, + val damage:Int, + val weight:Double, + protected var owner:ICharacter, + magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { } diff --git a/src/main/scala/weapon/Sword.scala b/src/main/scala/weapon/Sword.scala index b676ab0..5e0ca06 100644 --- a/src/main/scala/weapon/Sword.scala +++ b/src/main/scala/weapon/Sword.scala @@ -15,8 +15,11 @@ import unit.ICharacter * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ -class Sword(val name:String,val damage:Int,val weight:Double,var owner:ICharacter) extends AbstractCommonWeapon { +class Sword(val name:String, + val damage:Int, + val weight:Double, + protected var owner:ICharacter) extends AbstractCommonWeapon { } diff --git a/src/main/scala/weapon/Wand.scala b/src/main/scala/weapon/Wand.scala index 29e23bc..37668b2 100644 --- a/src/main/scala/weapon/Wand.scala +++ b/src/main/scala/weapon/Wand.scala @@ -16,8 +16,12 @@ import unit.ICharacter * * @author Javier Torres * @since 1.0.0 - * @version 1.0.0 + * @version 1.0.1 */ -class Wand(val name:String, val damage:Int, val weight:Double, var owner:ICharacter, magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { +class Wand(val name:String, + val damage:Int, + val weight:Double, + protected var owner:ICharacter, + magic_damage:Int) extends AbstractMagicWeapon(magic_damage) { } diff --git a/src/main/scala/weapon/Weapon.scala b/src/main/scala/weapon/Weapon.scala index edf7a20..71bf765 100644 --- a/src/main/scala/weapon/Weapon.scala +++ b/src/main/scala/weapon/Weapon.scala @@ -10,5 +10,5 @@ trait Weapon { val name: String val damage: Int val weight: Double - var owner: ICharacter + protected var owner: ICharacter } diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala index 7f42d4f..685a52e 100644 --- a/src/test/scala/combatsystem/CombatTest.scala +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -35,16 +35,16 @@ class CombatTest extends munit.FunSuite { test("Programmer Adding and removing Tests"){ TestTurns.add(member2) SomeParty.add(member2) - assertEquals(TestTurns.party,SomeParty) + assertEquals(TestTurns.getParty,SomeParty) TestTurns.add(enemy4) - assertEquals(TestTurns.enemies(3),enemy4) + assertEquals(TestTurns.getEnemies(3),enemy4) TestTurns.add(enemy5) TestTurns.add(enemy6) - assertEquals(TestTurns.enemies.last,enemy5) + assertEquals(TestTurns.getEnemies.last,enemy5) TestTurns.remove(member1) - assertEquals(TestTurns.party.member1.profession,null) + assertEquals(TestTurns.getParty.getMembers.head.profession,null) //Dummy Character has no profession TestTurns.remove(enemy3) - assertEquals(TestTurns.enemies,ListBuffer[Enemy](enemy1,enemy2,enemy4,enemy5)) + assertEquals(TestTurns.getEnemies,ListBuffer[Enemy](enemy1,enemy2,enemy4,enemy5)) } test("Programmer Turns Tests"){ TestTurns.add(member2) diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index d655618..0e72f21 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -13,6 +13,7 @@ class CharacterTest extends munit.FunSuite { var AliveParty: Party = _ var DeathParty: Party = _ var some_enemy: Enemy = _ + var some_death_enemy: Enemy = _ override def beforeEach(context: BeforeEach): Unit = { trainer = new Character("TrainerOne", 100, 50, 32.5, new Paladin) @@ -26,28 +27,29 @@ class CharacterTest extends munit.FunSuite { AliveParty.add(magic_trainer) DeathParty = new Party(new Character(profession = new Warrior),new Character(profession = new Warrior)) some_enemy = new EnemyClass("Bob",5,50,3,100.5) + some_death_enemy = new EnemyClass("Bob",0,50,3,100.5) } test("Character constructor checks"){ assertEquals(trainer.name,"TrainerOne") - assertEquals(trainer.life,100) - assertEquals(trainer.defense,50) + assertEquals(trainer.getLife,100) + assertEquals(trainer.getDefense,50) assertEquals(trainer.weight,32.5) assertEquals(trainer.profession.name,"Paladin") assertEquals(trainer2.weight,50.0) assertEquals(trainer2.heldweapon,null) assertEquals(magic_trainer.name,"magic") - assertEquals(magic_trainer.life,20) - assertEquals(magic_trainer.defense,5) + assertEquals(magic_trainer.getLife,20) + assertEquals(magic_trainer.getDefense,5) assertEquals(magic_trainer.weight,25.0) assertEquals(magic_trainer.profession.name,"Black Mage") - assertEquals(magic_trainer.mana,1000) - assertEquals(magic_trainer2.mana,1) + assertEquals(magic_trainer.getMana,1000) + assertEquals(magic_trainer2.getMana,1) assertEquals(weak_character.weight,30.0) - assertEquals(weak_character.defense,0) + assertEquals(weak_character.getDefense,0) assertEquals(weak_character2.weight,32.5) - assertEquals(weak_character2.defense,0) + assertEquals(weak_character2.getDefense,0) assertEquals(weak_character3.weight,10.0) - assertEquals(weak_character3.defense,0) + assertEquals(weak_character3.getDefense,0) } test("Party Status"){ assertEquals(AliveParty.isAlive,true) @@ -55,7 +57,6 @@ class CharacterTest extends munit.FunSuite { } test("Enemies"){ assertEquals(some_enemy.isAlive,true) - some_enemy.life = 0 - assertEquals(some_enemy.isAlive,false) + assertEquals(some_death_enemy.isAlive,false) } } From c012df97bf9af818b42c272f1c42c229e90ca4a8 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 11 May 2024 18:52:03 -0400 Subject: [PATCH 33/36] Added placeholderEquipWeapon method --- src/main/scala/unit/AbstractCharacter.scala | 10 ++++++++-- src/test/scala/combatsystem/CombatTest.scala | 4 ++-- src/test/scala/unit/CharacterTest.scala | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 345f5cd..2bee259 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -10,14 +10,20 @@ import weapon.Weapon * * @author Javier Torres * @since 1.0.0 - * @version 1.0.1 + * @version 1.0.2 */ abstract class AbstractCharacter extends ICharacter { /** The weapon this character is holding. * * Starts by default empty, meaning no held weapon. */ - var heldweapon: Weapon = null + protected var heldweapon: Weapon = null + /** Placeholder method to equip a weapon */ + def placeholderEquipWeapon(weapon:Weapon) : Unit ={ + heldweapon = weapon + } + /** Returns the equipped weapon */ + def getHeldWeapon : Weapon = heldweapon def isAlive: Boolean = { if (life > 0) true diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala index 685a52e..dba403a 100644 --- a/src/test/scala/combatsystem/CombatTest.scala +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -19,9 +19,9 @@ class CombatTest extends munit.FunSuite { override def beforeEach(context: BeforeEach): Unit = { member1 = new Character("Dude",100,5,50.0,new Warrior) - member1.heldweapon = new Sword("Test",10,12.5,member1) + member1.placeholderEquipWeapon(new Sword("Test",10,12.5,member1)) member2 = new MagicCharacter("Another Dude",100,1,40.25,new BlackMage, 500) - member2.heldweapon = new Wand("Test",10,12.5,member2, 50) + member2.placeholderEquipWeapon(new Wand("Test",10,12.5,member2, 50)) enemy1 = new EnemyClass("Foo",20,10,3,10.0) enemy2 = new EnemyClass("Another Foo",30,10,5,10.5) enemy3 = new EnemyClass("Foo III",45,12,30,12.5) diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index 0e72f21..e335f9e 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -36,7 +36,7 @@ class CharacterTest extends munit.FunSuite { assertEquals(trainer.weight,32.5) assertEquals(trainer.profession.name,"Paladin") assertEquals(trainer2.weight,50.0) - assertEquals(trainer2.heldweapon,null) + assertEquals(trainer2.getHeldWeapon,null) assertEquals(magic_trainer.name,"magic") assertEquals(magic_trainer.getLife,20) assertEquals(magic_trainer.getDefense,5) From 5f3f2a3212a6aea3893228dc262678f8fe0b3df7 Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 11 May 2024 19:28:09 -0400 Subject: [PATCH 34/36] Added Max values, and the use of require to avoid illegal values --- README.md | 3 +++ src/main/scala/unit/Character.scala | 12 +++++++++--- src/main/scala/unit/EnemyClass.scala | 15 ++++++++++----- src/main/scala/unit/MagicCharacter.scala | 15 ++++++++++++--- src/main/scala/unit/Units.scala | 1 + src/main/scala/weapon/AbstractCommonWeapon.scala | 5 ++++- src/main/scala/weapon/AbstractMagicWeapon.scala | 5 +++-- src/main/scala/weapon/Axe.scala | 3 ++- src/main/scala/weapon/Bow.scala | 3 ++- 9 files changed, 46 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 1c75316..7f7fccd 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,9 @@ perform an action with returned unit, otherwise keep stepping to increase action ### Final Assigment - Started the privatization of values and methods, making sure that var type values where at least protected, while val types can be public. And added methods to view some now private or protected values. +- Decided to add a maxLife value for units, it could be useful in the future for not healing over the maximum. +- Used require to avoid using illegal values in constructors. +- This project is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file diff --git a/src/main/scala/unit/Character.scala b/src/main/scala/unit/Character.scala index 3bfa555..ca885ac 100644 --- a/src/main/scala/unit/Character.scala +++ b/src/main/scala/unit/Character.scala @@ -1,5 +1,6 @@ package unit +import exceptions.Require import profession.Profession /** Class representing a Character. @@ -7,7 +8,7 @@ import profession.Profession * When initializing, one can skip the defense value, alternative constructor defaults it to 0. * * @param name The name of the character. - * @param life The life of the character. + * @param life The life and maxLife of the character. * @param defense The defense of the character. * @param weight The weight of the character. * @param profession The profession of the character. @@ -16,10 +17,10 @@ import profession.Profession * * @author Javier Torres * @since 1.0.0 - * @version 1.0.3 + * @version 1.0.4 */ class Character(val name: String = "Unknown", - protected var life: Int = 0, + protected var life : Int = 0, protected var defense: Int = 0, val weight: Double = 0.1, val profession:Profession) extends AbstractCharacter { @@ -27,6 +28,11 @@ class Character(val name: String = "Unknown", def this(x: String, l: Int, w: Double, p: Profession) = { this(x, l, 0, w, p) } + /** Max life value, initialized to the constructor life value */ + val maxLife : Int = life + Require.Stat(life,"life") atLeast 0 + Require.Stat(defense,"defense") atLeast 0 + require(weight>0,"number must be greater than zero") /**The actionbar of the character, starts at zero*/ private var actionbar : Double = 0 /**The threshold to complete to consider a complete actionbar and be able to get a turn*/ diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index 3ae9e30..bf72612 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -1,18 +1,18 @@ package unit +import exceptions.Require + /** Class representing an Enemy. * * @param name The name of the enemy. - * @param life The life of the enemy. + * @param life The life and maxLife of the enemy. * @param damage The damage of the enemy. * @param defense The defense of the enemy. * @param weight The weight of the enemy. - * * @constructor Creates a new Enemy. - * * @author Javier Torres * @since 1.0.0 - * @version 1.0.3 + * @version 1.0.4 */ class EnemyClass(val name: String, protected var life:Int, @@ -23,7 +23,12 @@ class EnemyClass(val name: String, if (life > 0) true else false } - + /** Max life value, initialized to the constructor life value */ + val maxLife : Int = life + Require.Stat(life,"life") atLeast 0 + Require.Stat(defense,"defense") atLeast 0 + Require.Stat(damage,"damage") atLeast 0 + require(weight>0,"number must be greater than zero") /**The actionbar of the enemy, starts at zero*/ private var actionbar : Double = 0 diff --git a/src/main/scala/unit/MagicCharacter.scala b/src/main/scala/unit/MagicCharacter.scala index 951b6c5..cb6ea30 100644 --- a/src/main/scala/unit/MagicCharacter.scala +++ b/src/main/scala/unit/MagicCharacter.scala @@ -1,5 +1,6 @@ package unit +import exceptions.Require import profession.Profession /** Class representing a Magic Character. @@ -7,7 +8,7 @@ import profession.Profession * When initializing, one can skip the defense value, alternative constructor defaults it to 0. * * @param name The name of the magic character. - * @param life The life of the magic character. + * @param life The life and maxLife of the magic character. * @param defense The defense of the magic character. * @param weight The weight of the magic character. * @param profession The profession of the magic character. @@ -17,18 +18,26 @@ import profession.Profession * * @author Javier Torres * @since 1.0.0 - * @version 1.0.3 + * @version 1.0.4 */ class MagicCharacter(val name: String = "Unknown", protected var life: Int = 0, protected var defense: Int = 0, val weight: Double = 0.1, val profession: Profession, - private var mana:Int=0) extends AbstractCharacter { + private var mana:Int=1) extends AbstractCharacter { /** Alternative constructor if one where to skip defense, defaulting it to 0 */ def this(x: String, l: Int, w: Double, p: Profession, m: Int) = { this(x, l, 0, w, p, m) } + /** Max life value, initialized to the constructor life value */ + val maxLife : Int = life + /** Max mana value, initialized to the constructor mana value */ + val maxMana : Int = mana + Require.Stat(life,"life") atLeast 0 + Require.Stat(defense,"defense") atLeast 0 + require(weight>0,"number must be greater than zero") + Require.Stat(mana,"mana") atLeast 0 /**The actionbar of the character, starts at zero*/ private var actionbar : Double = 0 /**The threshold to complete to consider a complete actionbar and be able to get a turn*/ diff --git a/src/main/scala/unit/Units.scala b/src/main/scala/unit/Units.scala index 40f8e5d..f1e555e 100644 --- a/src/main/scala/unit/Units.scala +++ b/src/main/scala/unit/Units.scala @@ -9,6 +9,7 @@ trait Units { protected var life: Int protected var defense: Int val weight: Double + val maxLife: Int /** Determines if the current entity is alive. * diff --git a/src/main/scala/weapon/AbstractCommonWeapon.scala b/src/main/scala/weapon/AbstractCommonWeapon.scala index 826bec1..2355862 100644 --- a/src/main/scala/weapon/AbstractCommonWeapon.scala +++ b/src/main/scala/weapon/AbstractCommonWeapon.scala @@ -1,5 +1,7 @@ package weapon +import exceptions.Require + /** Abstract class representing non magic weapons. * * Used by [[weapon.Axe]], [[weapon.Bow]], and [[weapon.Sword]] @@ -9,5 +11,6 @@ package weapon * @version 1.0.0 */ abstract class AbstractCommonWeapon extends Weapon{ - + Require.Stat(damage,"damage") atLeast 0 + require(weight>0,"number must be greater than zero") } diff --git a/src/main/scala/weapon/AbstractMagicWeapon.scala b/src/main/scala/weapon/AbstractMagicWeapon.scala index 340eca0..7f37eeb 100644 --- a/src/main/scala/weapon/AbstractMagicWeapon.scala +++ b/src/main/scala/weapon/AbstractMagicWeapon.scala @@ -1,15 +1,16 @@ package weapon +import exceptions.Require + /** Abstract class representing magic weapons. * * Used by [[weapon.Staff]], and [[weapon.Wand]] * * @param magic_damage The magic damage of the weapon. - * * @author Javier Torres * @since 1.0.0 * @version 1.0.0 */ abstract class AbstractMagicWeapon(val magic_damage: Int) extends Weapon{ - +Require.Stat(magic_damage,"Magic damage") atLeast 0 } diff --git a/src/main/scala/weapon/Axe.scala b/src/main/scala/weapon/Axe.scala index 04e4626..c8eed1f 100644 --- a/src/main/scala/weapon/Axe.scala +++ b/src/main/scala/weapon/Axe.scala @@ -1,5 +1,6 @@ package weapon +import exceptions.Require import unit.ICharacter /** Class representing an Axe. @@ -15,7 +16,7 @@ import unit.ICharacter * * @author Javier Torres * @since 1.0.0 - * @version 1.0.1 + * @version 1.0.2 */ class Axe(val name:String, val damage:Int, diff --git a/src/main/scala/weapon/Bow.scala b/src/main/scala/weapon/Bow.scala index 8779753..2910368 100644 --- a/src/main/scala/weapon/Bow.scala +++ b/src/main/scala/weapon/Bow.scala @@ -1,5 +1,6 @@ package weapon +import exceptions.Require import unit.ICharacter /** Class representing a Bow. @@ -15,7 +16,7 @@ import unit.ICharacter * * @author Javier Torres * @since 1.0.0 - * @version 1.0.1 + * @version 1.0.2 */ class Bow(val name:String, val damage:Int, From 46ce456fd41df73cc80ffb139d6376ee2383d9fa Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 11 May 2024 20:05:49 -0400 Subject: [PATCH 35/36] Added attacking and taking damage methods --- README.md | 3 ++- src/main/scala/unit/AbstractCharacter.scala | 10 ++++++++++ src/main/scala/unit/Enemy.scala | 8 ++++++++ src/main/scala/unit/EnemyClass.scala | 11 ++++++++++ src/main/scala/unit/ICharacter.scala | 12 ++++++++++- src/main/scala/unit/Units.scala | 1 + src/test/scala/combatsystem/CombatTest.scala | 21 +++++++++++++++++++- 7 files changed, 63 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7f7fccd..e40ac73 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,8 @@ perform an action with returned unit, otherwise keep stepping to increase action val types can be public. And added methods to view some now private or protected values. - Decided to add a maxLife value for units, it could be useful in the future for not healing over the maximum. - Used require to avoid using illegal values in constructors. -- +- Added methods for character attacking enemies, enemies attacking characters, character taking damage by enemies, +and enemies taking damage by characters. This project is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file diff --git a/src/main/scala/unit/AbstractCharacter.scala b/src/main/scala/unit/AbstractCharacter.scala index 2bee259..dab7a0b 100644 --- a/src/main/scala/unit/AbstractCharacter.scala +++ b/src/main/scala/unit/AbstractCharacter.scala @@ -36,4 +36,14 @@ abstract class AbstractCharacter extends ICharacter { def getDefense: Int ={ defense } + + def attackAnEnemy(who:Enemy) : Unit = { + if(heldweapon != null) who.hurtByCharacter(this) //nothing happens if no weapon is held + } + def hurtByEnemy(who:Enemy) : Unit ={ + var howMuchWillItHurt : Int = who.getDamage - defense + if(howMuchWillItHurt < 0) howMuchWillItHurt = 0 + life -= howMuchWillItHurt + if(life < 0) life = 0 + } } diff --git a/src/main/scala/unit/Enemy.scala b/src/main/scala/unit/Enemy.scala index 649e6e2..befbfeb 100644 --- a/src/main/scala/unit/Enemy.scala +++ b/src/main/scala/unit/Enemy.scala @@ -8,4 +8,12 @@ trait Enemy extends Units{ protected var damage: Int /** Returns the damage value of the enemy */ def getDamage: Int + /** Method that calls hurtByEnemy on target character + * @param who The character to attack + * */ + def attackACharacter(who:ICharacter) : Unit + /** Method that handles taking damage from character attack + * @param who The Character attacking the enemy + * */ + def hurtByCharacter(who:ICharacter) : Unit } diff --git a/src/main/scala/unit/EnemyClass.scala b/src/main/scala/unit/EnemyClass.scala index bf72612..a8c8563 100644 --- a/src/main/scala/unit/EnemyClass.scala +++ b/src/main/scala/unit/EnemyClass.scala @@ -53,4 +53,15 @@ class EnemyClass(val name: String, def getLife: Int = life def getDamage: Int = damage def getDefense: Int = defense + + def attackACharacter(who:ICharacter) : Unit = { + who.hurtByEnemy(this) + } + def hurtByCharacter(who:ICharacter) : Unit ={ + val howMuchDamage : Int = who.getHeldWeapon.damage + var howMuchWillItHurt : Int = howMuchDamage - defense + if(howMuchWillItHurt < 0) howMuchWillItHurt = 0 + life -= howMuchWillItHurt + if(life < 0) life = 0 + } } diff --git a/src/main/scala/unit/ICharacter.scala b/src/main/scala/unit/ICharacter.scala index bb4ba77..7523ee5 100644 --- a/src/main/scala/unit/ICharacter.scala +++ b/src/main/scala/unit/ICharacter.scala @@ -1,5 +1,6 @@ package unit import profession.Profession +import weapon.Weapon /** Trait mainly used for type in constructors. * Also provides a profession to the character. @@ -10,5 +11,14 @@ trait ICharacter extends Units{ /** Updates the maxActionbar to the correct value */ def updateMaxActionbar() : Unit - + def getHeldWeapon : Weapon + /** Method that calls hurtByCharacter on target enemy; + * Can't attack and enemy if no weapon is held + * @param who The enemy to attack + * */ + def attackAnEnemy(who:Enemy) : Unit + /** Method that handles taking damage from enemy attack + * @param who The Enemy attacking the character + * */ + def hurtByEnemy(who:Enemy) : Unit } diff --git a/src/main/scala/unit/Units.scala b/src/main/scala/unit/Units.scala index f1e555e..8f6096b 100644 --- a/src/main/scala/unit/Units.scala +++ b/src/main/scala/unit/Units.scala @@ -24,4 +24,5 @@ trait Units { def getLife : Int /** Returns the defense of the unit */ def getDefense : Int + } diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala index dba403a..5399c13 100644 --- a/src/test/scala/combatsystem/CombatTest.scala +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -8,6 +8,7 @@ import scala.collection.mutable.ListBuffer class CombatTest extends munit.FunSuite { var member1 : Character = _ var member2 : MagicCharacter = _ + var member3 : Character = _ var enemy1 : EnemyClass = _ var enemy2 : EnemyClass = _ var enemy3 : EnemyClass = _ @@ -19,9 +20,10 @@ class CombatTest extends munit.FunSuite { override def beforeEach(context: BeforeEach): Unit = { member1 = new Character("Dude",100,5,50.0,new Warrior) - member1.placeholderEquipWeapon(new Sword("Test",10,12.5,member1)) + member1.placeholderEquipWeapon(new Sword("Test",50,12.5,member1)) member2 = new MagicCharacter("Another Dude",100,1,40.25,new BlackMage, 500) member2.placeholderEquipWeapon(new Wand("Test",10,12.5,member2, 50)) + member3 = new Character("Dude with no weapon",100,5,50.0,new Warrior) enemy1 = new EnemyClass("Foo",20,10,3,10.0) enemy2 = new EnemyClass("Another Foo",30,10,5,10.5) enemy3 = new EnemyClass("Foo III",45,12,30,12.5) @@ -60,4 +62,21 @@ class CombatTest extends munit.FunSuite { if(TestTurns.anyTurn) assertEquals(TestTurns.getTurn,member1) assertEquals(TestTurns.anyTurn,false) } + test("Attack Tests"){ + member1.attackAnEnemy(enemy1) + assertEquals(enemy1.getLife,0) + member1.attackAnEnemy(enemy3) + assertEquals(enemy3.getLife,25) + member2.attackAnEnemy(enemy5) + assertEquals(enemy5.getLife,100) + member3.attackAnEnemy(enemy2) + assertEquals(enemy2.getLife,30) + + enemy4.attackACharacter(member1) + assertEquals(member1.getLife,90) + enemy6.attackACharacter(member2) + assertEquals(member2.getLife,1) + enemy6.attackACharacter(member2) + assertEquals(member2.getLife,0) + } } From 33ec4a7f67dc74787ca2cfefcb58f0db4fa2f9ad Mon Sep 17 00:00:00 2001 From: JTJetc Date: Sat, 11 May 2024 20:26:38 -0400 Subject: [PATCH 36/36] Added more tests --- README.md | 1 + src/test/scala/combatsystem/CombatTest.scala | 7 +++++++ src/test/scala/unit/CharacterTest.scala | 13 +++++++++++++ 3 files changed, 21 insertions(+) diff --git a/README.md b/README.md index e40ac73..2ae8c8c 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ val types can be public. And added methods to view some now private or protected - Used require to avoid using illegal values in constructors. - Added methods for character attacking enemies, enemies attacking characters, character taking damage by enemies, and enemies taking damage by characters. +- Added more tests for more code coverage. This project is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file diff --git a/src/test/scala/combatsystem/CombatTest.scala b/src/test/scala/combatsystem/CombatTest.scala index 5399c13..ef6ba35 100644 --- a/src/test/scala/combatsystem/CombatTest.scala +++ b/src/test/scala/combatsystem/CombatTest.scala @@ -79,4 +79,11 @@ class CombatTest extends munit.FunSuite { enemy6.attackACharacter(member2) assertEquals(member2.getLife,0) } + test("Placeholder update actionbar after equipping weapon tests"){ + member1.updateMaxActionbar() + member2.updateMaxActionbar() + member3.updateMaxActionbar() + member2.placeholderEquipWeapon(null) + member2.updateMaxActionbar() + } } diff --git a/src/test/scala/unit/CharacterTest.scala b/src/test/scala/unit/CharacterTest.scala index e335f9e..e981207 100644 --- a/src/test/scala/unit/CharacterTest.scala +++ b/src/test/scala/unit/CharacterTest.scala @@ -1,5 +1,6 @@ package unit +import exceptions.InvalidStatException import profession.{BlackMage, Ninja, Paladin, Warrior, WhiteMage} class CharacterTest extends munit.FunSuite { @@ -34,16 +35,20 @@ class CharacterTest extends munit.FunSuite { assertEquals(trainer.getLife,100) assertEquals(trainer.getDefense,50) assertEquals(trainer.weight,32.5) + assertEquals(trainer.maxLife,100) assertEquals(trainer.profession.name,"Paladin") assertEquals(trainer2.weight,50.0) assertEquals(trainer2.getHeldWeapon,null) assertEquals(magic_trainer.name,"magic") assertEquals(magic_trainer.getLife,20) + assertEquals(magic_trainer.maxLife,20) assertEquals(magic_trainer.getDefense,5) assertEquals(magic_trainer.weight,25.0) assertEquals(magic_trainer.profession.name,"Black Mage") assertEquals(magic_trainer.getMana,1000) assertEquals(magic_trainer2.getMana,1) + assertEquals(magic_trainer2.maxMana,1) + assertEquals(magic_trainer2.getHeldWeapon,null) assertEquals(weak_character.weight,30.0) assertEquals(weak_character.getDefense,0) assertEquals(weak_character2.weight,32.5) @@ -56,7 +61,15 @@ class CharacterTest extends munit.FunSuite { assertEquals(DeathParty.isAlive,false) } test("Enemies"){ + assertEquals(some_enemy.getDefense,3) + assertEquals(some_enemy.maxLife,5) assertEquals(some_enemy.isAlive,true) assertEquals(some_death_enemy.isAlive,false) } + test("Require Exception"){ + intercept[InvalidStatException](new Character("Life Bug", -1, 50, 32.5, new Paladin)) + intercept[InvalidStatException](new Character("Defense Bug", 10, -10, 32.5, new Paladin)) + intercept[IllegalArgumentException](new Character("Weight Bug", 10, 100, 0, new Paladin)) + intercept[InvalidStatException](new MagicCharacter("Magic Bug", 20, 5, 25, new BlackMage, -1)) + } }