diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala
index c1193cc8..553aac71 100644
--- a/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala
+++ b/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala
@@ -66,7 +66,6 @@ object AvatarConverter {
def MakeAppearanceData(obj : Player) : (Int)=>CharacterAppearanceData = {
CharacterAppearanceData(
BasicCharacterData(obj.Name, obj.Faction, obj.Sex, obj.Head, obj.Voice),
- voice2 = 0,
black_ops = false,
jammered = false,
obj.ExoSuit,
@@ -96,7 +95,7 @@ object AvatarConverter {
}, //TODO not precise
DressBattleRank(obj),
DressCommandRank(obj),
- recursiveMakeImplantEffects(obj.Implants.iterator),
+ MakeImplantEffectList(obj.Implants),
MakeCosmetics(obj.BEP)
)
}
@@ -196,34 +195,24 @@ object AvatarConverter {
}
/**
- * Find an active implant whose effect will be displayed on this player.
- * @param iter an `Iterator` of `ImplantSlot` objects
+ * Find and encode implants whose effect will be displayed on this player.
+ * @param implants a `Sequence` of `ImplantSlot` objects
* @return the effect of an active implant
*/
- @tailrec private def recursiveMakeImplantEffects(iter : Iterator[(ImplantType.Value, Long, Boolean)]) : Option[ImplantEffects.Value] = {
- if(!iter.hasNext) {
- None
- }
- else {
- val(implant, _, active) = iter.next
- if(active) {
+ private def MakeImplantEffectList(implants : Seq[(ImplantType.Value, Long, Boolean)]) : List[ImplantEffects.Value] = {
+ implants.collect {
+ case ((implant,_,true)) =>
implant match {
case ImplantType.AdvancedRegen =>
- Some(ImplantEffects.RegenEffects)
+ ImplantEffects.RegenEffects
case ImplantType.DarklightVision =>
- Some(ImplantEffects.DarklightEffects)
+ ImplantEffects.DarklightEffects
case ImplantType.PersonalShield =>
- Some(ImplantEffects.PersonalShieldEffects)
+ ImplantEffects.PersonalShieldEffects
case ImplantType.Surge =>
- Some(ImplantEffects.SurgeEffects)
- case _ =>
- recursiveMakeImplantEffects(iter)
+ ImplantEffects.SurgeEffects
}
- }
- else {
- recursiveMakeImplantEffects(iter)
- }
- }
+ }.toList
}
/**
diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/CharacterSelectConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/CharacterSelectConverter.scala
index 4a432fea..96029e14 100644
--- a/common/src/main/scala/net/psforever/objects/definition/converter/CharacterSelectConverter.scala
+++ b/common/src/main/scala/net/psforever/objects/definition/converter/CharacterSelectConverter.scala
@@ -51,7 +51,6 @@ class CharacterSelectConverter extends AvatarConverter {
private def MakeAppearanceData(obj : Player) : (Int)=>CharacterAppearanceData = {
CharacterAppearanceData(
BasicCharacterData(obj.Name, obj.Faction, obj.Sex, obj.Head, CharacterVoice.Mute),
- voice2 = 0,
black_ops = false,
jammered = false,
obj.ExoSuit,
diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala
index 762b48da..359b5c5b 100644
--- a/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala
+++ b/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala
@@ -46,7 +46,6 @@ class CorpseConverter extends AvatarConverter {
private def MakeAppearanceData(obj : Player) : (Int)=>CharacterAppearanceData = {
CharacterAppearanceData(
BasicCharacterData(obj.Name, obj.Faction, CharacterGender.Male, 0, CharacterVoice.Mute),
- voice2 = 0,
black_ops = false,
jammered = false,
obj.ExoSuit,
diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterAppearanceData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterAppearanceData.scala
index fb6eee6e..e512b944 100644
--- a/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterAppearanceData.scala
+++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterAppearanceData.scala
@@ -35,9 +35,9 @@ import shapeless.{::, HNil}
* `RibbonBars`
* @see `http://www.planetside-universe.com/p-outfit-decals-31.htm`
* @param app the player's cardinal appearance settings
- * @param voice2 na;
- * affects the frequency by which the character's voice is heard (somehow);
- * commonly 3 for best results
+// * @param voice2 na;
+// * affects the frequency by which the character's voice is heard (somehow);
+// * commonly 3 for best results
* @param black_ops whether or not this avatar is enrolled in Black OPs
* @param jammered the player has been caught in an EMP blast recently;
* creates a jammered sound effect that follows the player around and can be heard by others
@@ -61,7 +61,6 @@ import shapeless.{::, HNil}
* @param ribbons the four merit commendation ribbon medals
*/
final case class CharacterAppearanceData(app : BasicCharacterData,
- voice2 : Int,
black_ops : Boolean,
jammered : Boolean,
exosuit : ExoSuitType.Value,
@@ -140,13 +139,16 @@ object CharacterAppearanceData extends Marshallable[CharacterAppearanceData] {
("sex" | CharacterGender.codec) ::
("head" | uint8L) ::
("voice" | CharacterVoice.codec) ::
- ("voice2" | uint2L) ::
- ignore(78) :: //unknown
+ uint32L ::
+ uint16L ::
+ uint16L ::
+ uint16L ::
uint16L :: //usually either 0 or 65535
uint32L :: //for outfit_name (below) to be visible in-game, this value should be non-zero
("outfit_name" | PacketHelpers.encodedWideStringAligned( outfitNamePadding )) ::
("outfit_logo" | uint8L) ::
ignore(1) :: //unknown
+ //TODO bool :: //ps.c 1069587
("backpack" | bool) :: //requires alt_model flag (does NOT require health == 0)
bool :: //stream misalignment when set
("facingPitch" | Angular.codec_pitch) ::
@@ -166,32 +168,34 @@ object CharacterAppearanceData extends Marshallable[CharacterAppearanceData] {
})
).exmap[CharacterAppearanceData] (
{
- case _ :: _ :: false :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: true :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: HNil |
- _ :: _ :: false :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: true :: _ :: HNil =>
+ case _ :: _ :: false :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: true :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: HNil |
+ _ :: _ :: false :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: _ :: true :: _ :: HNil =>
Attempt.Failure(Err("invalid character appearance data; can not encode alternate model without required bit set"))
- case faction :: bops :: _ :: _ :: jamd :: false :: 0 :: name :: suit :: _ :: sex :: head :: v1 :: v2 :: _ :: _ :: _/*has_outfit_name*/ :: outfit :: logo :: _ :: bpack :: false :: facingPitch :: facingYawUpper :: _ :: _ :: _ :: lfs :: gstate :: cloaking :: _ :: false :: charging :: _ :: zipline :: ribbons :: HNil =>
+ case faction :: bops :: _ :: _ :: jamd :: false :: 0 :: name :: suit :: _ :: sex :: head :: v1 :: _ :: _ :: _ :: _ :: _ :: _/*has_outfit_name*/ :: outfit :: logo :: _ :: bpack :: false :: facingPitch :: facingYawUpper :: _ :: _ :: _ :: lfs :: gstate :: cloaking :: _ :: false :: charging :: _ :: zipline :: ribbons :: HNil =>
Attempt.successful(
- CharacterAppearanceData(BasicCharacterData(name, faction, sex, head, v1), v2, bops, jamd, suit, outfit, logo, bpack, facingPitch, facingYawUpper, lfs, gstate, cloaking, charging, zipline, ribbons)(name_padding)
+ CharacterAppearanceData(BasicCharacterData(name, faction, sex, head, v1), bops, jamd, suit, outfit, logo, bpack, facingPitch, facingYawUpper, lfs, gstate, cloaking, charging, zipline, ribbons)(name_padding)
)
case _ =>
Attempt.Failure(Err("invalid character appearance data; can not encode"))
},
{
- case CharacterAppearanceData(BasicCharacterData(name, PlanetSideEmpire.NEUTRAL, _, _, _), _, _, _, _, _, _, _, _, _, _, _, _, _, _, _) =>
+ case CharacterAppearanceData(BasicCharacterData(name, PlanetSideEmpire.NEUTRAL, _, _, _), _, _, _, _, _, _, _, _, _, _, _, _, _, _) =>
Attempt.failure(Err(s"character $name's faction can not declare as neutral"))
- case CharacterAppearanceData(BasicCharacterData(name, faction, sex, head, v1), v2, bops, jamd, suit, outfit, logo, bpack, facingPitch, facingYawUpper, lfs, gstate, cloaking, charging, zipline, ribbons) =>
+ case CharacterAppearanceData(BasicCharacterData(name, faction, sex, head, voice), bops, jamd, suit, outfit, logo, bpack, facingPitch, facingYawUpper, lfs, gstate, cloaking, charging, zipline, ribbons) =>
val has_outfit_name : Long = outfit.length.toLong //TODO this is a kludge
var alt_model : Boolean = false
var alt_model_extrabit : Option[Boolean] = None
+ var volume : Long = 192L
if(zipline || bpack) {
alt_model = true
alt_model_extrabit = Some(false)
+ volume = 0L
}
Attempt.successful(
- faction :: bops :: alt_model :: () :: jamd :: false :: 0 :: name :: suit :: () :: sex :: head :: v1 :: v2 :: () :: 0 :: has_outfit_name :: outfit :: logo :: () :: bpack :: false :: facingPitch :: facingYawUpper :: () :: alt_model_extrabit :: () :: lfs :: gstate :: cloaking :: () :: false :: charging :: () :: zipline :: ribbons :: HNil
+ faction :: bops :: alt_model :: () :: jamd :: false :: 0 :: name :: suit :: () :: sex :: head :: voice :: volume :: 0 :: 0 :: 0 :: 0 :: has_outfit_name :: outfit :: logo :: () :: bpack :: false :: facingPitch :: facingYawUpper :: () :: alt_model_extrabit :: () :: lfs :: gstate :: cloaking :: () :: false :: charging :: () :: zipline :: ribbons :: HNil
)
case _ =>
diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterData.scala
index d89e6d37..446ceee4 100644
--- a/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterData.scala
+++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/CharacterData.scala
@@ -8,8 +8,7 @@ import shapeless.{::, HNil}
/**
* Values for the implant effects on a character model.
- * The effects can not be activated simultaneously.
- * In at least one case, attempting to activate multiple effects will cause the PlanetSide client to crash.
+ * The effects are not additive and this value is not a bitmask.
*
* `RegenEffects` is a reverse-flagged item - inactive when the corresponding bit is set.
* For that reason, every other effect is `n`+1, while `NoEffects` is 1 and `RegenEffects` is 0.
@@ -65,7 +64,8 @@ object UniformStyle extends Enumeration {
* @param command_rank the player's command rank as a number from 0 to 5;
* cosmetic armor associated with the command rank will be applied automatically
* @param implant_effects the effects of implants that can be seen on a player's character;
- * though many implants can be used simultaneously, only one implant effect can be applied here
+ * the number of entries equates to the number of effects applied;
+ * the maximu number of effects is three
* @param cosmetics optional decorative features that are added to the player's head model by console/chat commands;
* they become available at battle rank 24, but here they require the third uniform upgrade (rank 25);
* these flags do not exist if they are not applicable
@@ -82,7 +82,7 @@ final case class CharacterData(health : Int,
uniform_upgrade : UniformStyle.Value,
unk : Int,
command_rank : Int,
- implant_effects : Option[ImplantEffects.Value],
+ implant_effects : List[ImplantEffects.Value],
cosmetics : Option[Cosmetics])
(is_backpack : Boolean,
is_seated : Boolean) extends ConstructorData {
@@ -90,7 +90,7 @@ final case class CharacterData(health : Int,
override def bitsize : Long = {
//factor guard bool values into the base size, not its corresponding optional field
val seatedSize = if(is_seated) { 0 } else { 16 }
- val effectsSize : Long = if(implant_effects.isDefined) { 4L } else { 0L }
+ val effectsSize : Long = implant_effects.length * 4L
val cosmeticsSize : Long = if(cosmetics.isDefined) { cosmetics.get.bitsize } else { 0L }
11L + seatedSize + effectsSize + cosmeticsSize
}
@@ -107,22 +107,21 @@ object CharacterData extends Marshallable[CharacterData] {
* @param cosmetics optional decorative features that are added to the player's head model by console/chat commands
* @return a `CharacterData` object
*/
- def apply(health : Int, armor : Int, uniform : UniformStyle.Value, cr : Int, implant_effects : Option[ImplantEffects.Value], cosmetics : Option[Cosmetics]) : (Boolean,Boolean)=>CharacterData =
+ def apply(health : Int, armor : Int, uniform : UniformStyle.Value, cr : Int, implant_effects : List[ImplantEffects.Value], cosmetics : Option[Cosmetics]) : (Boolean,Boolean)=>CharacterData =
CharacterData(health, armor, uniform, 0, cr, implant_effects, cosmetics)
def codec(is_backpack : Boolean) : Codec[CharacterData] = (
("health" | uint8L) :: //dead state when health == 0
("armor" | uint8L) ::
(("uniform_upgrade" | UniformStyle.codec) >>:~ { style =>
- ignore(3) :: //unknown
+ ignore(3) :: //uniform_upgrade is actually interpreted as a 6u field, but the lower 3u seems to be discarded
("command_rank" | uintL(3)) ::
- bool :: //misalignment when == 1
- optional(bool, "implant_effects" | ImplantEffects.codec) ::
+ listOfN(uint2, "implant_effects" | ImplantEffects.codec) ::
conditional(style == UniformStyle.ThirdUpgrade, "cosmetics" | Cosmetics.codec)
})
).exmap[CharacterData] (
{
- case health :: armor :: uniform :: _ :: cr :: false :: implant_effects :: cosmetics :: HNil =>
+ case health :: armor :: uniform :: _ :: cr :: implant_effects :: cosmetics :: HNil =>
val newHealth = if(is_backpack) { 0 } else { health }
Attempt.Successful(CharacterData(newHealth, armor, uniform, 0, cr, implant_effects, cosmetics)(is_backpack, false))
@@ -132,7 +131,7 @@ object CharacterData extends Marshallable[CharacterData] {
{
case CharacterData(health, armor, uniform, _, cr, implant_effects, cosmetics) =>
val newHealth = if(is_backpack) { 0 } else { health }
- Attempt.Successful(newHealth :: armor :: uniform :: () :: cr :: false :: implant_effects :: cosmetics :: HNil)
+ Attempt.Successful(newHealth :: armor :: uniform :: () :: cr :: implant_effects :: cosmetics :: HNil)
case _ =>
Attempt.Failure(Err("invalid character data; can not decode"))
@@ -141,23 +140,22 @@ object CharacterData extends Marshallable[CharacterData] {
def codec_seated(is_backpack : Boolean) : Codec[CharacterData] = (
("uniform_upgrade" | UniformStyle.codec) >>:~ { style =>
- ignore(3) :: //unknown
+ ignore(3) :: //uniform_upgrade is actually interpreted as a 6u field, but the lower 3u seems to be discarded
("command_rank" | uintL(3)) ::
- bool :: //stream misalignment when != 1
- optional(bool, "implant_effects" | ImplantEffects.codec) ::
+ listOfN(uint2, "implant_effects" | ImplantEffects.codec) ::
conditional(style == UniformStyle.ThirdUpgrade, "cosmetics" | Cosmetics.codec)
}
).exmap[CharacterData] (
{
- case uniform :: _ :: cr :: false :: implant_effects :: cosmetics :: HNil =>
+ case uniform :: _ :: cr :: implant_effects :: cosmetics :: HNil =>
Attempt.Successful(new CharacterData(100, 0, uniform, 0, cr, implant_effects, cosmetics)(is_backpack, true))
case _ =>
Attempt.Failure(Err("invalid character data; can not encode"))
},
{
- case obj @ CharacterData(_, _, uniform, _, cr, implant_effects, cosmetics) =>
- Attempt.Successful(uniform :: () :: cr :: false :: implant_effects :: cosmetics :: HNil)
+ case CharacterData(_, _, uniform, _, cr, implant_effects, cosmetics) =>
+ Attempt.Successful(uniform :: () :: cr :: implant_effects :: cosmetics :: HNil)
case _ =>
Attempt.Failure(Err("invalid character data; can not decode"))
diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala
index fa7f7f93..cac2796b 100644
--- a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala
+++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala
@@ -44,12 +44,6 @@ final case class ImplantEntry(implant : ImplantType.Value,
* @param armor for `x / y` of armor points, this is the avatar's `x` value;
* range is 0-65535;
* the avatar's `y` armor points is tied to their exo-suit type
- * @param unk1 na;
- * defaults to 1
- * @param unk2 na;
- * defaults to 7
- * @param unk3 na;
- * defaults to 7
* @param staminaMax for `x / y` of stamina points, this is the avatar's `y` value;
* range is 0-65535
* @param stamina for `x / y` of stamina points, this is the avatar's `x` value;
@@ -73,9 +67,6 @@ final case class DetailedCharacterData(bep : Long,
healthMax : Int,
health : Int,
armor : Int,
- unk1 : Int, //1
- unk2 : Int, //7
- unk3 : Int, //7
staminaMax : Int,
stamina : Int,
certs : List[CertificationType.Value],
@@ -111,24 +102,6 @@ final case class DetailedCharacterData(bep : Long,
}
object DetailedCharacterData extends Marshallable[DetailedCharacterData] {
- /**
- * Overloaded constructor for `DetailedCharacterData` that requires an inventory and drops unknown values.
- * @param bep the avatar's battle experience points, which determines his Battle Rank
- * @param cep the avatar's command experience points, which determines his Command Rank
- * @param healthMax for `x / y` of hitpoints, this is the avatar's `y` value
- * @param health for `x / y` of hitpoints, this is the avatar's `x` value
- * @param armor for `x / y` of armor points, this is the avatar's `x` value
- * @param staminaMax for `x / y` of stamina points, this is the avatar's `y` value
- * @param stamina for `x / y` of stamina points, this is the avatar's `x` value
- * @param certs the `List` of active certifications
- * @param implants the `List` of implant slots currently possessed by this avatar
- * @param firstTimeEvents the list of first time events performed by this avatar
- * @param tutorials the list of tutorials completed by this avatar
- * @return a `DetailedCharacterData` object
- */
- def apply(bep : Long, cep : Long, healthMax : Int, health : Int, armor : Int, staminaMax : Int, stamina : Int, certs : List[CertificationType.Value], implants : List[ImplantEntry], firstTimeEvents : List[String], tutorials : List[String], cosmetics : Option[Cosmetics]) : (Option[Int])=>DetailedCharacterData =
- DetailedCharacterData(bep, cep, healthMax, health, armor, 1, 7, 7, staminaMax, stamina, certs, implants, firstTimeEvents, tutorials, cosmetics)
-
/**
* `Codec` for entries in the `List` of implants.
*/
@@ -255,16 +228,14 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] {
def codec(pad_length : Option[Int]) : Codec[DetailedCharacterData] = (
("bep" | uint32L) >>:~ { bep =>
("cep" | uint32L) ::
- ignore(96) ::
+ uint32L ::
+ uint32L ::
+ uint32L ::
("healthMax" | uint16L) ::
("health" | uint16L) ::
ignore(1) ::
("armor" | uint16L) ::
- ignore(9) ::
- ("unk1" | uint8L) ::
- ignore(8) ::
- ("unk2" | uint4L) ::
- ("unk3" | uintL(3)) ::
+ uint32 :: //TODO switch endianness
("staminaMax" | uint16L) ::
("stamina" | uint16L) ::
ignore(147) ::
@@ -290,14 +261,14 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] {
}
).exmap[DetailedCharacterData] (
{
- case bep :: cep :: _ :: hpmax :: hp :: _ :: armor :: _ :: u1 :: _ :: u2 :: u3 :: stamax :: stam :: _ :: certs :: _ :: _ :: implants :: _ :: _ :: fte0 :: fte1 :: _ :: tut0 :: tut1 :: _ :: _ :: _ :: cosmetics :: HNil =>
+ case bep :: cep :: 0 :: 0 :: 0 :: hpmax :: hp :: _ :: armor :: 32831L :: stamax :: stam :: _ :: certs :: _ :: _ :: implants :: _ :: _ :: fte0 :: fte1 :: _ :: tut0 :: tut1 :: _ :: _ :: _ :: cosmetics :: HNil =>
//prepend the displaced first elements to their lists
val fteList : List[String] = if(fte0.isDefined) { fte0.get +: fte1 } else { fte1 }
val tutList : List[String] = if(tut0.isDefined) { tut0.get +: tut1 } else { tut1 }
- Attempt.successful(DetailedCharacterData(bep, cep, hpmax, hp, armor, u1, u2, u3, stamax, stam, certs, implants, fteList, tutList, cosmetics)(pad_length))
+ Attempt.successful(new DetailedCharacterData(bep, cep, hpmax, hp, armor, stamax, stam, certs, implants, fteList, tutList, cosmetics)(pad_length))
},
{
- case DetailedCharacterData(bep, cep, hpmax, hp, armor, u1, u2, u3, stamax, stam, certs, implants, fteList, tutList, cos) =>
+ case DetailedCharacterData(bep, cep, hpmax, hp, armor, stamax, stam, certs, implants, fteList, tutList, cos) =>
val implantCapacity : Int = numberOfImplantSlots(bep)
val implantList = if(implants.length > implantCapacity) {
implants.slice(0, implantCapacity)
@@ -318,7 +289,7 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] {
}
val br24 : Boolean = isBR24(bep)
val cosmetics : Option[Cosmetics] = if(br24) { cos } else { None }
- Attempt.successful(bep :: cep :: () :: hpmax :: hp :: () :: armor :: () :: u1 :: () :: u2 :: u3 :: stamax :: stam :: () :: certs :: None :: () :: implantList :: () :: fteList.size.toLong :: firstEvent :: fteListCopy :: tutList.size.toLong :: firstTutorial :: tutListCopy :: () :: br24 :: () :: cosmetics :: HNil)
+ Attempt.successful(bep :: cep :: 0L :: 0L :: 0L :: hpmax :: hp :: () :: armor :: 32831L :: stamax :: stam :: () :: certs :: None :: () :: implantList :: () :: fteList.size.toLong :: firstEvent :: fteListCopy :: tutList.size.toLong :: firstTutorial :: tutListCopy :: () :: br24 :: () :: cosmetics :: HNil)
}
)
diff --git a/common/src/test/scala/game/objectcreate/CharacterDataTest.scala b/common/src/test/scala/game/objectcreate/CharacterDataTest.scala
index 6115f231..e1c55732 100644
--- a/common/src/test/scala/game/objectcreate/CharacterDataTest.scala
+++ b/common/src/test/scala/game/objectcreate/CharacterDataTest.scala
@@ -38,7 +38,6 @@ class CharacterDataTest extends Specification {
basic.app.sex mustEqual CharacterGender.Male
basic.app.head mustEqual 5
basic.app.voice mustEqual CharacterVoice.Voice5
- basic.voice2 mustEqual 3
basic.black_ops mustEqual false
basic.jammered mustEqual false
basic.exosuit mustEqual ExoSuitType.Reinforced
@@ -60,8 +59,8 @@ class CharacterDataTest extends Specification {
char.armor mustEqual 253
char.uniform_upgrade mustEqual UniformStyle.ThirdUpgrade
char.command_rank mustEqual 5
- char.implant_effects.isDefined mustEqual true
- char.implant_effects.get mustEqual ImplantEffects.NoEffects
+ char.implant_effects.length mustEqual 1
+ char.implant_effects.head mustEqual ImplantEffects.NoEffects
char.cosmetics.isDefined mustEqual true
char.cosmetics.get.no_helmet mustEqual true
char.cosmetics.get.beret mustEqual true
@@ -131,7 +130,6 @@ class CharacterDataTest extends Specification {
basic.app.sex mustEqual CharacterGender.Male
basic.app.head mustEqual 5
basic.app.voice mustEqual CharacterVoice.Voice5
- basic.voice2 mustEqual 3
basic.black_ops mustEqual false
basic.jammered mustEqual false
basic.exosuit mustEqual ExoSuitType.Reinforced
@@ -175,7 +173,6 @@ class CharacterDataTest extends Specification {
basic.app.sex mustEqual CharacterGender.Male
basic.app.head mustEqual 10
basic.app.voice mustEqual CharacterVoice.Voice2
- basic.voice2 mustEqual 0
basic.black_ops mustEqual false
basic.jammered mustEqual false
basic.exosuit mustEqual ExoSuitType.MAX
@@ -197,7 +194,7 @@ class CharacterDataTest extends Specification {
char.armor mustEqual 0
char.uniform_upgrade mustEqual UniformStyle.ThirdUpgrade
char.command_rank mustEqual 2
- char.implant_effects.isDefined mustEqual false
+ char.implant_effects.isEmpty mustEqual true
char.cosmetics.isDefined mustEqual true
char.cosmetics.get.no_helmet mustEqual true
char.cosmetics.get.beret mustEqual true
@@ -228,7 +225,6 @@ class CharacterDataTest extends Specification {
5,
CharacterVoice.Voice5
),
- 3,
false,
false,
ExoSuitType.Reinforced,
@@ -250,7 +246,7 @@ class CharacterDataTest extends Specification {
255, 253,
UniformStyle.ThirdUpgrade,
5,
- Some(ImplantEffects.NoEffects),
+ List(ImplantEffects.NoEffects),
Some(Cosmetics(true, true, true, true, false))
)
val inv = InventoryData(
@@ -284,7 +280,6 @@ class CharacterDataTest extends Specification {
5,
CharacterVoice.Voice5
),
- 3,
false,
false,
ExoSuitType.Reinforced,
@@ -306,7 +301,7 @@ class CharacterDataTest extends Specification {
255, 253,
UniformStyle.ThirdUpgrade,
5,
- Some(ImplantEffects.NoEffects),
+ List(ImplantEffects.NoEffects),
Some(Cosmetics(true, true, true, true, false))
)
val inv = InventoryData(
@@ -337,7 +332,6 @@ class CharacterDataTest extends Specification {
10,
CharacterVoice.Voice2
),
- 0,
false,
false,
ExoSuitType.MAX,
@@ -359,7 +353,7 @@ class CharacterDataTest extends Specification {
0, 0,
UniformStyle.ThirdUpgrade,
2,
- None,
+ List(),
Some(Cosmetics(true, true, true, true, false))
)
val obj = PlayerData(pos, app, char, DrawnSlot.Pistol1)
diff --git a/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala b/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala
index b571749b..2ce1c8c0 100644
--- a/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala
+++ b/common/src/test/scala/game/objectcreatedetailed/DetailedCharacterDataTest.scala
@@ -39,7 +39,6 @@ class DetailedCharacterDataTest extends Specification {
basic.app.sex mustEqual CharacterGender.Female
basic.app.head mustEqual 41
basic.app.voice mustEqual CharacterVoice.Voice1
- basic.voice2 mustEqual 3
basic.black_ops mustEqual false
basic.jammered mustEqual false
basic.exosuit mustEqual ExoSuitType.Standard
@@ -63,9 +62,6 @@ class DetailedCharacterDataTest extends Specification {
char.healthMax mustEqual 100
char.health mustEqual 100
char.armor mustEqual 50 //standard exosuit value
- char.unk1 mustEqual 1
- char.unk2 mustEqual 7
- char.unk3 mustEqual 7
char.staminaMax mustEqual 100
char.stamina mustEqual 100
char.certs.length mustEqual 7
@@ -175,7 +171,6 @@ class DetailedCharacterDataTest extends Specification {
basic.app.sex mustEqual CharacterGender.Female
basic.app.head mustEqual 41
basic.app.voice mustEqual CharacterVoice.Voice1
- basic.voice2 mustEqual 3
basic.black_ops mustEqual false
basic.jammered mustEqual false
basic.exosuit mustEqual ExoSuitType.Standard
@@ -199,9 +194,6 @@ class DetailedCharacterDataTest extends Specification {
char.healthMax mustEqual 100
char.health mustEqual 100
char.armor mustEqual 50 //standard exosuit value
- char.unk1 mustEqual 1
- char.unk2 mustEqual 7
- char.unk3 mustEqual 7
char.staminaMax mustEqual 100
char.stamina mustEqual 100
char.certs.length mustEqual 7
@@ -382,7 +374,6 @@ class DetailedCharacterDataTest extends Specification {
41,
CharacterVoice.Voice1
),
- 3,
false,
false,
ExoSuitType.Standard,
@@ -402,7 +393,6 @@ class DetailedCharacterDataTest extends Specification {
0,
100, 100,
50,
- 1, 7, 7,
100, 100,
List(
CertificationType.StandardAssault,
@@ -453,7 +443,6 @@ class DetailedCharacterDataTest extends Specification {
41,
CharacterVoice.Voice1
),
- 3,
false,
false,
ExoSuitType.Standard,
@@ -473,7 +462,6 @@ class DetailedCharacterDataTest extends Specification {
0,
100, 100,
50,
- 1, 7, 7,
100, 100,
List(
CertificationType.StandardAssault,
@@ -520,7 +508,6 @@ class DetailedCharacterDataTest extends Specification {
)
val app : (Int)=>CharacterAppearanceData = CharacterAppearanceData(
BasicCharacterData("KiCkJr", PlanetSideEmpire.NC, CharacterGender.Male, 24, CharacterVoice.Voice4),
- 3,
false, false,
ExoSuitType.Agile,
"",
@@ -541,7 +528,6 @@ class DetailedCharacterDataTest extends Specification {
6366766,
694787,
100, 100, 100,
- 1, 7, 7,
100, 46,
List(
CertificationType.StandardAssault,
diff --git a/common/src/test/scala/game/objectcreatevehicle/MountedVehiclesTest.scala b/common/src/test/scala/game/objectcreatevehicle/MountedVehiclesTest.scala
index ca939ebe..72653dda 100644
--- a/common/src/test/scala/game/objectcreatevehicle/MountedVehiclesTest.scala
+++ b/common/src/test/scala/game/objectcreatevehicle/MountedVehiclesTest.scala
@@ -57,7 +57,6 @@ class MountedVehiclesTest extends Specification {
app.app.sex mustEqual CharacterGender.Male
app.app.head mustEqual 5
app.app.voice mustEqual CharacterVoice.Voice5
- app.voice2 mustEqual 3
app.black_ops mustEqual false
app.lfs mustEqual false
app.outfit_name mustEqual "Black Beret Armoured Corps"
@@ -76,7 +75,7 @@ class MountedVehiclesTest extends Specification {
char.armor mustEqual 0
char.uniform_upgrade mustEqual UniformStyle.ThirdUpgrade
char.command_rank mustEqual 5
- char.implant_effects mustEqual None
+ char.implant_effects.isEmpty mustEqual true
char.cosmetics mustEqual Some(Cosmetics(true, true, true, true, false))
inv.size mustEqual 4
inv.head.objectClass mustEqual ObjectClass.medicalapplicator
@@ -107,7 +106,6 @@ class MountedVehiclesTest extends Specification {
"encode (Scrawny Ronnie's mosquito)" in {
val app : (Int)=>CharacterAppearanceData = CharacterAppearanceData(
BasicCharacterData("ScrawnyRonnie", PlanetSideEmpire.TR, CharacterGender.Male, 5, CharacterVoice.Voice5),
- 3,
false, false,
ExoSuitType.Agile,
"Black Beret Armoured Corps",
@@ -128,7 +126,7 @@ class MountedVehiclesTest extends Specification {
UniformStyle.ThirdUpgrade,
0,
5,
- None,
+ Nil,
Some(Cosmetics(true, true, true, true, false))
)
val inv : InventoryData = InventoryData(