Modified ability export to better handle numerical types, modified the settings controller to handle updated exports

This commit is contained in:
Malcolm Roberts 2023-12-18 10:44:31 -06:00
parent 33b9ab6f43
commit 2df0795b56
7 changed files with 133 additions and 627 deletions

View File

@ -1,158 +0,0 @@
objectdef CastStackAbility
{
variable string Name
variable string AbilityTarget
variable string AbilityType
variable int Percentage
variable string Tag
method Initialize(jsonvalueref jo)
{
This:FromJSON[jo]
}
method FromJSON(jsonvalueref jo)
{
Name:Set["${jo.Get[Name]~}"]
AbilityTarget:Set["${jo.Get[AbilityTarget]~}"]
AbilityType:Set["${jo.Get[AbilityType]~}"]
Percentage:Set[${jo.Get[Percentage]~}]
; Tag:Set["${jo.Get[Tag]~}"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="{}"
jo:SetString[Name, "${Name~}"]
jo:SetString[AbilityTarget, "${AbilityTarget~}"]
jo:SetString[AbilityType, "${AbilityType~}"]
jo:SetString[Percentage, ${Percentage~}]
jo:SetString[Tag, "${Tag~}"]
return jo
}
}
objectdef CastStackContainer
{
variable index:CastStackAbility Abilities
method AddAbilityFromJSON(jsonvalueref jo)
{
if !${jo.Type.Equal[object]}
{
return FALSE
}
Abilities:Insert[jo]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="[]"
variable iterator abilityIterator
Abilities:GetIterator[abilityIterator]
if ${abilityIterator:First(exists)}
{
do
{
jo:Add["${abilityIterator.Value.AsJSON~}"]
}
while ${abilityIterator:Next(exists)}
}
return jo
}
}
objectdef Profile
{
variable string Name
variable jsonvalue Settings = "{}"
variable jsonvalue Setup
variable jsonvalue Aliases
variable CastStackContainer CastStack
method Initialize(jsonvalueref jo)
{
This:FromJSON[jo]
}
member:bool GetSettingValue(string key)
{
echo "Profile.GetSettingValue[${key}]"
return ${This.Settings.Get["${key}"]}
}
method FromJSON(jsonvalueref jo)
{
Name:Set["${jo.Get["Name"]~}"]
Settings:SetValue["${jo.Get["Settings"]~}"]
Setup:SetValue["${jo.Get["Setup"]~}"]
Aliases:SetValue["${jo.Get["Aliases"]~}"]
jo.Get["CastStack"]:ForEach["CastStack:AddAbilityFromJSON[ForEach.Value]"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="{}"
jo:Set["Name", "${This.Name.AsJSON~}"]
jo:Set["Settings", "${Settings.AsJSON~}"]
jo:Set["Setup", "${Setup.AsJSON~}"]
jo:Set["Aliases", "${Aliases.AsJSON~}"]
jo:Set["CastStack", "${CastStack.AsJSON~}"]
return jo
}
}
objectdef BotSettings
{
variable string DefaultProfile
variable collection:Profile Profiles
method FromFile(string filename)
{
variable jsonvalue settingsJson
variable BotSettings settings
settingsJson:ParseFile["${filename}"]
This:FromJSON[settingsJson]
}
member:bool IsSettingChecked(string key)
{
echo "BotSettings.IsSettingChecked[${key}]"
return ${This.CurrentProfile.GetSettingValue["${key}"].Equal[TRUE]}
}
method FromJSON(jsonvalueref jo)
{
DefaultProfile:Set[${jo.Get["DefaultProfile"]}]
variable jsoniterator profileIterator
jo.Get["Profiles"]:GetIterator[profileIterator]
if ${profileIterator:First(exists)}
{
do
{
Profiles:Set[${profileIterator.Key}, profileIterator.Value]
}
while ${profileIterator:Next(exists)}
}
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="{}"
jo:Set[DefaultProfile, "${DefaultProfile.AsJSON~}"]
jo:Set[Profiles, "${Profiles.AsJSON~}"]
return jo
}
member:weakref CurrentProfile()
{
return Profiles.Element["${This.DefaultProfile}"]
}
}

View File

@ -64,9 +64,9 @@ function:bool hasMatchingEffect(jsonvalueref effects, jsonvalueref specialEffect
function:jsonvalueref extractDamageFromEffect(jsonvalueref effectJo)
{
variable string description
description:Set["${effectJo.Get["description"]}"]
if ${description.Left[8].NotEqual["Inflicts"]}
{
return "{}"
@ -91,8 +91,8 @@ function:jsonvalueref extractDamageFromEffect(jsonvalueref effectJo)
variable jsonvalue damage
damage:SetValue["$$>{
"type": "${damageType}",
"min": "${minDamage}",
"max": "${maxDamage}"
"min": ${minDamage},
"max": ${maxDamage}
}<$$"]
if !${damageType(exists)}
@ -140,46 +140,48 @@ function main()
echo "Exporting (${Counter} / ${MyAbilities.Used}) - ${MyAbilitiesIterator.Value.ToAbilityInfo.Name} (ID: ${MyAbilitiesIterator.Value.ID})"
currentAbility:SetValue["$$>{
"id": "${MyAbilitiesIterator.Value.ID}",
"id": ${MyAbilitiesIterator.Value.ID},
"name": "${MyAbilitiesIterator.Value.ToAbilityInfo.Name}",
"description": ${MyAbilitiesIterator.Value.ToAbilityInfo.Description.AsJSON~},
"level": "${MyAbilitiesIterator.Value.ToAbilityInfo.Class[${Me.SubClass}].Level}",
"level": ${MyAbilitiesIterator.Value.ToAbilityInfo.Class[${Me.SubClass}].Level},
"tier": "${MyAbilitiesIterator.Value.ToAbilityInfo.Tier}",
"healthCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCost}",
"powerCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCost}",
"dissonanceCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCost}",
"savageryCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCost}",
"concentrationCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.ConcentrationCost}",
"mainIconID": "${MyAbilitiesIterator.Value.ToAbilityInfo.MainIconID}",
"hoIconID": "${MyAbilitiesIterator.Value.ToAbilityInfo.HOIconID}",
"castingTime": "${MyAbilitiesIterator.Value.ToAbilityInfo.CastingTime}",
"recoveryTime": "${MyAbilitiesIterator.Value.ToAbilityInfo.RecoveryTime}",
"recastTime": "${MyAbilitiesIterator.Value.ToAbilityInfo.RecastTime}",
"maxDuration": "${MyAbilitiesIterator.Value.ToAbilityInfo.MaxDuration}",
"numClasses": "${MyAbilitiesIterator.Value.ToAbilityInfo.NumClasses}",
"numEffects": "${MyAbilitiesIterator.Value.ToAbilityInfo.NumEffects}",
"backDropIconID": "${MyAbilitiesIterator.Value.ToAbilityInfo.BackDropIconID}",
"healthCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCostPerTick}",
"powerCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCostPerTick}",
"dissonanceCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCostPerTick}",
"savageryCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCostPerTick}",
"maxAOETargets": "${MyAbilitiesIterator.Value.ToAbilityInfo.MaxAOETargets}",
"isBeneficial": "${MyAbilitiesIterator.Value.ToAbilityInfo.IsBeneficial}",
"doesNotExpire": "${MyAbilitiesIterator.Value.ToAbilityInfo.DoesNotExpire}",
"groupRestricted": "${MyAbilitiesIterator.Value.ToAbilityInfo.GroupRestricted}",
"allowRaid": "${MyAbilitiesIterator.Value.ToAbilityInfo.AllowRaid}",
"effectRadius": "${MyAbilitiesIterator.Value.ToAbilityInfo.EffectRadius}",
"targetType": "${MyAbilitiesIterator.Value.ToAbilityInfo.TargetType}",
"spellBookType": "${MyAbilitiesIterator.Value.ToAbilityInfo.SpellBookType}",
"minRange": "${MyAbilitiesIterator.Value.ToAbilityInfo.MinRange}",
"maxRange": "${MyAbilitiesIterator.Value.ToAbilityInfo.MaxRange}"
"healthCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCost},
"powerCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCost},
"dissonanceCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCost},
"savageryCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCost},
"concentrationCost": ${MyAbilitiesIterator.Value.ToAbilityInfo.ConcentrationCost},
"mainIconID": ${MyAbilitiesIterator.Value.ToAbilityInfo.MainIconID},
"hoIconID": ${MyAbilitiesIterator.Value.ToAbilityInfo.HOIconID},
"castingTime": ${MyAbilitiesIterator.Value.ToAbilityInfo.CastingTime},
"recoveryTime": ${MyAbilitiesIterator.Value.ToAbilityInfo.RecoveryTime},
"recastTime": ${MyAbilitiesIterator.Value.ToAbilityInfo.RecastTime},
"maxDuration": ${MyAbilitiesIterator.Value.ToAbilityInfo.MaxDuration},
"numClasses": ${MyAbilitiesIterator.Value.ToAbilityInfo.NumClasses},
"numEffects": ${MyAbilitiesIterator.Value.ToAbilityInfo.NumEffects},
"backDropIconID": ${MyAbilitiesIterator.Value.ToAbilityInfo.BackDropIconID},
"healthCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCostPerTick},
"powerCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCostPerTick},
"dissonanceCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCostPerTick},
"savageryCostPerTick": ${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCostPerTick},
"maxAOETargets": ${MyAbilitiesIterator.Value.ToAbilityInfo.MaxAOETargets},
"isBeneficial": "${MyAbilitiesIterator.Value.ToAbilityInfo.IsBeneficial.AsJSON}",
"doesNotExpire": "${MyAbilitiesIterator.Value.ToAbilityInfo.DoesNotExpire.AsJSON}",
"groupRestricted": "${MyAbilitiesIterator.Value.ToAbilityInfo.GroupRestricted.AsJSON}",
"allowRaid": "${MyAbilitiesIterator.Value.ToAbilityInfo.AllowRaid.AsJSON}",
"effectRadius": ${MyAbilitiesIterator.Value.ToAbilityInfo.EffectRadius},
"targetType": ${MyAbilitiesIterator.Value.ToAbilityInfo.TargetType},
"spellBookType": ${MyAbilitiesIterator.Value.ToAbilityInfo.SpellBookType},
"minRange": ${MyAbilitiesIterator.Value.ToAbilityInfo.MinRange},
"maxRange": ${MyAbilitiesIterator.Value.ToAbilityInfo.MaxRange}
}<$$"]
for (idx:Set[1] ; ${idx} < ${MyAbilitiesIterator.Value.ToAbilityInfo.NumEffects} ; idx:Inc )
{
abilityEffect:SetValue["$$>{
"percentSuccess": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].PercentSuccess},
"indentation": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].Indentation},
"percentSuccess": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].PercentSuccess.AsJSON~},
"indentation": "${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].Indentation.AsJSON~}",
"description": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].Description.AsJSON~}
}<$$"]
@ -187,31 +189,31 @@ function main()
call matchesItemInArray stealthRequiredEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["requiresStealth", ${Return}]
currentAbility:Set["requiresStealth", ${Return.AsJSON~}]
}
call matchesItemInArray flankingRequiredEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["requiresFlanking", ${Return}]
currentAbility:Set["requiresFlanking", ${Return.AsJSON~}]
}
call matchesItemInArray noEpicEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["noEpic", ${Return}]
currentAbility:Set["noEpic", ${Return.AsJSON~}]
}
call matchesItemInArray stunEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["stuns", ${Return}]
currentAbility:Set["stuns", ${Return.AsJSON~}]
}
call matchesItemInArray interruptEffects ${abilityEffect.Get["description"]}
if ${Return}
{
currentAbility:Set["interrupts", ${Return}]
currentAbility:Set["interrupts", ${Return.AsJSON~}]
}
call extractDamageFromEffect abilityEffect
@ -220,11 +222,14 @@ function main()
variable string damageType
variable int64 minDamage
; TODO: Add a loop to handle multiple damage effects.
; TODO: Modify extractDmaageFromEffect to also calculate damage for
; damage over time effects.
damageType:Set["${Return.Get["type"]}"]
minDamage:Set["${Return.Get["min"]}"]
currentAbility:Set["doesDamage", TRUE]
if ${currentAbility.Has["damage", ${Return.Get["type"]}]}
if ${currentAbility.Has["damage", "${Return.Get["type"]}"]}
{
variable int64 currentMinDamageTotal
@ -251,6 +256,8 @@ function main()
abilityEffect:Clear
}
currentAbility:Set["effects", "${effects.AsJSON~}"]
effects:Clear

View File

@ -1,94 +0,0 @@
; function main()
; {
; variable KnowledgeBook kb
; variable index:ability MyAbilities
; variable iterator MyAbilitiesIterator
; variable jsonvalue effects = []
; variable jsonvalue abilityEffect = {}
; variable int idx = 1
; variable int Counter = 1
; variable int Timer = 0
; variable jsonvalue currentAbility = {}
; Me:QueryAbilities[MyAbilities]
; MyAbilities:GetIterator[MyAbilitiesIterator]
; if ${MyAbilitiesIterator:First(exists)}
; {
; do
; {
; if (!${MyAbilitiesIterator.Value.IsAbilityInfoAvailable})
; {
; do
; {
; wait 2
; }
; while (!${MyAbilitiesIterator.Value.IsAbilityInfoAvailable} && ${Timer:Inc} < 1500)
; }
; wait 5
; echo "Exporting (${Counter} / ${MyAbilities.Size}) - ${MyAbilitiesIterator.Value.ToAbilityInfo.Name} (ID: ${MyAbilitiesIterator.Value.ID})"
; currentAbility:SetValue["$$>{
; "ID": "${MyAbilitiesIterator.Value.ID}",
; "Name": "${MyAbilitiesIterator.Value.ToAbilityInfo.Name}",
; "Description": ${MyAbilitiesIterator.Value.ToAbilityInfo.Description.AsJSON~},
; "Level": "${MyAbilitiesIterator.Value.ToAbilityInfo.Class[${Me.SubClass}].Level}",
; "Tier": "${MyAbilitiesIterator.Value.ToAbilityInfo.Tier}",
; "HealthCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCost}",
; "PowerCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCost}",
; "DissonanceCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCost}",
; "SavageryCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCost}",
; "ConcentrationCost": "${MyAbilitiesIterator.Value.ToAbilityInfo.ConcentrationCost}",
; "MainIconID": "${MyAbilitiesIterator.Value.ToAbilityInfo.MainIconID}",
; "HOIconID": "${MyAbilitiesIterator.Value.ToAbilityInfo.HOIconID}",
; "CastingTime": "${MyAbilitiesIterator.Value.ToAbilityInfo.CastingTime}",
; "RecoveryTime": "${MyAbilitiesIterator.Value.ToAbilityInfo.RecoveryTime}",
; "RecastTime": "${MyAbilitiesIterator.Value.ToAbilityInfo.RecastTime}",
; "MaxDuration": "${MyAbilitiesIterator.Value.ToAbilityInfo.MaxDuration}",
; "NumClasses": "${MyAbilitiesIterator.Value.ToAbilityInfo.NumClasses}",
; "NumEffects": "${MyAbilitiesIterator.Value.ToAbilityInfo.NumEffects}",
; "BackDropIconID": "${MyAbilitiesIterator.Value.ToAbilityInfo.BackDropIconID}",
; "HealthCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.HealthCostPerTick}",
; "PowerCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.PowerCostPerTick}",
; "DissonanceCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.DissonanceCostPerTick}",
; "SavageryCostPerTick": "${MyAbilitiesIterator.Value.ToAbilityInfo.SavageryCostPerTick}",
; "MaxAOETargets": "${MyAbilitiesIterator.Value.ToAbilityInfo.MaxAOETargets}",
; "IsBeneficial": "${MyAbilitiesIterator.Value.ToAbilityInfo.IsBeneficial}",
; "DoesNotExpire": "${MyAbilitiesIterator.Value.ToAbilityInfo.DoesNotExpire}",
; "GroupRestricted": "${MyAbilitiesIterator.Value.ToAbilityInfo.GroupRestricted}",
; "AllowRaid": "${MyAbilitiesIterator.Value.ToAbilityInfo.AllowRaid}",
; "IsBeneficial": "${MyAbilitiesIterator.Value.ToAbilityInfo.IsBeneficial}",
; "EffectRadius": "${MyAbilitiesIterator.Value.ToAbilityInfo.EffectRadius}",
; "TargetType": "${MyAbilitiesIterator.Value.ToAbilityInfo.TargetType}",
; "SpellBookType": "${MyAbilitiesIterator.Value.ToAbilityInfo.SpellBookType}",
; "MinRange": "${MyAbilitiesIterator.Value.ToAbilityInfo.MinRange}",
; "MaxRange": "${MyAbilitiesIterator.Value.ToAbilityInfo.MaxRange}"
; }<$$"]
; for (idx:Set[1] ; ${idx} < ${MyAbilitiesIterator.Value.ToAbilityInfo.NumEffects} ; idx:Inc )
; {
; abilityEffect:SetValue["$$>{
; "PercentSuccess": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].PercentSuccess},
; "Indentation": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].Indentation},
; "Description": ${MyAbilitiesIterator.Value.ToAbilityInfo.Effect[${idx}].Description.AsJSON~}
; }<$$"]
; effects:Add["${abilityEffect.AsJSON~}"]
; abilityEffect:Clear
; }
; currentAbility:Set["Effects", "${effects.AsJSON~}"]
; effects:Clear
; kb:AddAbilityFromJSON[currentAbility]
; Counter:Inc
; Timer:Set[0]
; }
; while ${MyAbilitiesIterator:Next(exists)}
; }
; kb:WriteFile["${LavishScript.HomeDirectory}/Scripts/mr/bot/ability_exports/${Me.Name}_${Me.SubClass}.json"]
; }

View File

@ -1,4 +1,3 @@
#include "${LavishScript.HomeDirectory}/scripts/mr/common/KnowledgeBook.iss"
#include "${LavishScript.HomeDirectory}/scripts/mr/common/JsonHelpers.iss"
objectdef SettingsController
@ -15,7 +14,29 @@ objectdef SettingsController
variable jsonvalue jo
jo:ParseFile["${LavishScript.HomeDirectory}/scripts/mr/bot/ability_exports/Ihaihu_shadowknight.json"]
abilityListItems:SetValue["${MRJsonHelper.FilterArray[jo, "Details.SpellBookType", "<", 2].AsJSON~}"]
if ${jo.Type.NotEqual["object"]}
{
echo "Error parsing ability list"
return
}
variable jsonvalueref keys
keys:SetReference[jo.Keys]
variable int idx
for (idx:Set[1] ; ${idx} < ${keys.Used} ; idx:Inc)
{
variable string key
key:Set["${keys.Get[${idx}]}"]
variable jsonvalue abilityItem = "{}"
if ${jo.Get["${key}"].Get[1, "spellBookType"]} < 2
{
abilityItem:SetValue[$$>{
"Name": "${key~}"
}<$$]
abilityListItems:Add[${abilityItem}]
}
}
}
method Shutdown()
@ -33,7 +54,6 @@ objectdef SettingsController
newCastStackItem:SetValue["$$>{
"action": "ability",
"name": "${abilityListItems.Get[${selectedIndex}, "Name"]}"
"id": "${abilityListItems.Get[${selectedIndex}, "CurrentID"]}"
}<$$"]
}

View File

@ -1,6 +1,23 @@
#ifndef _mr_json_helper_
#define _mr_json_helper_
objectdef MRJsonHelper
{
;;;
;;; Returns an array of property values from items from the given json array that match the given query string
;;; for example, given the following json array:
;;; [
;;; {"Id": 1, "Name": "Obj1", "Type": { "Name": "Obj1Type" }},
;;; {"Id": 2, "Name": "Obj2", "Type": { "Name": "Obj2Type" }},
;;; ]
;;; and the query string "Type.Name", the result would be:
;;; [
;;; "Obj1Type",
;;; "Obj2Type"
;;; ]
;;; @param jsonvalueref ref - The json array to query
;;; @param str queryString - The query string to use to filter the array, i.e. "Id" or "Type.Name"
;;; @return jsonvalueref An array of property values from items from the given json array that match the given query string
static member:jsonvalueref QueryJsonArray(jsonvalueref ref, string queryString)
{
if !${ref.Type.Equal[array]}
@ -51,6 +68,23 @@ objectdef MRJsonHelper
return result
}
;;;
;;; Returns a jsonvalue that contains the value of the given property from the given json object or array.
;;; if the given jsonvalue is an array, the result will be an array of values from the given property from each item in the array
;;;
;;; for example, given the following json array:
;;; [
;;; {"Id": 1, "Name": "Obj1", "Type": { "Name": "Obj1Type" }},
;;; {"Id": 2, "Name": "Obj2", "Type": { "Name": "Obj2Type" }},
;;; ]
;;; and the query string "Type.Name", the result would be:
;;; [
;;; "Obj1Type",
;;; "Obj2Type"
;;; ]
;;; @param jsonvalueref ref - The json array to query
;;; @param str queryString - The query string to use to filter the array, i.e. "Id" or "Type.Name"
;;; @return jsonvalueref A jsonvalue that contains the value of the given property from the given json object or array.
static member:jsonvalueref QueryJson(jsonvalueref ref, string queryString)
{
if ${ref.Type.Equal[array]}
@ -59,11 +93,6 @@ objectdef MRJsonHelper
}
}
static member:jsonvalueref FilterArray(jsonvalueref ref, string queryString, string operator, int value)
{
echo "int version"
}
static member:jsonvalueref FilterArray(jsonvalueref ref, string queryString, string operator, string value)
{
if !${ref.Type.Equal[array]}
@ -212,6 +241,7 @@ objectdef MRJsonHelper
}
}
#endif
; objectdef test

View File

@ -1,315 +0,0 @@
#include "${LavishScript.HomeDirectory}/Scripts/mr/common/StringHelpers.iss"
objectdef AbilityEffect
{
variable int64 ID
variable int64 Indentation
variable string Description
method Initialize(jsonvalueref jo)
{
This:FromJSON[jo]
}
method FromJSON(jsonvalueref jo)
{
echo "AbilityEffect:FromJSON ${jo.Type}"
if !${jo.Type.Equal[object]}
{
return FALSE
}
ID:Set["${jo.Get[ID]~}"]
Indentation:Set["${jo.Get[Indentation]~}"]
Description:Set["${jo.Get[Description]~}"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="{}"
jo:SetInteger[ID, "${ID~}"]
jo:SetInteger[Indentation, "${Indentation~}"]
jo:SetString[Description, "${Description~}"]
return jo
}
}
objectdef AbilityEffectCollection
{
variable index:AbilityEffect Effects
method AddEffectFromJSON(jsonvalueref jo)
{
if !${jo.Type.Equal[object]}
{
echo "AbilityEffectCollection:AddEffectFromJSON jo is not an object"
return FALSE
}
Effects:Insert[jo]
}
method FromJSON(jsonvalueref jo)
{
if !${jo.Type.Equal[array]}
{
return FALSE
}
jo:ForEach["This:AddEffectFromJSON[ForEach.Value]"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="[]"
variable iterator effectIterator
Effects:GetIterator[effectIterator]
if ${effectIterator:First(exists)}
{
do
{
jo:Add["${effectIterator.Value.AsJSON~}"]
}
while ${effectIterator:Next(exists)}
}
return jo
}
}
objectdef AbilityDetail
{
variable int64 ID
variable string Name
variable string Description
variable int Level
variable string Tier
variable int HealthCost
variable int PowerCost
variable int DissonanceCost
variable int SavageryCost
variable int ConcentrationCost
variable float CastingTime
variable float RecoveryTime
variable float RecastTime
variable float MaxDuration
variable int HealthCostPerTick
variable int PowerCostPerTick
variable int DissonanceCostPerTick
variable int SavageryCostPerTick
variable int MaxAOETargets
variable bool IsBeneficial
variable bool DoesNotExpire
variable bool GroupRestricted
variable bool AllowRaid
variable int TargetType
variable int SpellBookType
variable float MinRange
variable float MaxRange
variable AbilityEffectCollection Effects
method Initialize(jsonvalueref jo)
{
This:FromJSON[jo]
}
method FromJSON(jsonvalueref jo)
{
if !${jo.Type.Equal[object]}
{
return FALSE
}
Name:Set["${jo.Get[Name]~}"]
Description:Set["${jo.Get[Description]~}"]
ID:Set["${jo.Get[ID]~}"]
Level:Set["${jo.Get[Level]~}"]
Tier:Set["${jo.Get[Tier]~}"]
HealthCost:Set["${jo.Get[HealthCost]~}"]
PowerCost:Set["${jo.Get[PowerCost]~}"]
DissonanceCost:Set["${jo.Get[DissonanceCost]~}"]
SavageryCost:Set["${jo.Get[SavageryCost]~}"]
ConcentrationCost:Set["${jo.Get[ConcentrationCost]~}"]
CastingTime:Set["${jo.Get[CastingTime]~}"]
RecoveryTime:Set["${jo.Get[RecoveryTime]~}"]
RecastTime:Set["${jo.Get[RecastTime]~}"]
MaxDuration:Set["${jo.Get[MaxDuration]~}"]
HealthCostPerTick:Set["${jo.Get[HealthCostPerTick]~}"]
PowerCostPerTick:Set["${jo.Get[PowerCostPerTick]~}"]
DissonanceCostPerTick:Set["${jo.Get[DissonanceCostPerTick]~}"]
SavageryCostPerTick:Set["${jo.Get[SavageryCostPerTick]~}"]
MaxAOETargets:Set["${jo.Get[MaxAOETargets]~}"]
IsBeneficial:Set["${jo.Get[IsBeneficial]~}"]
DoesNotExpire:Set["${jo.Get[DoesNotExpire]~}"]
GroupRestricted:Set["${jo.Get[GroupRestricted]~}"]
AllowRaid:Set["${jo.Get[AllowRaid]~}"]
TargetType:Set["${jo.Get[TargetType]~}"]
SpellBookType:Set["${jo.Get[SpellBookType]~}"]
MinRange:Set["${jo.Get[MinRange]~}"]
MaxRange:Set["${jo.Get[MaxRange]~}"]
Effects:FromJSON["${jo.Get["Effects"]~}"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="{}"
jo:SetString[Name, "${Name~}"]
jo:SetString[Description, "${Description~}"]
jo:SetString[ID, "${ID~}"]
jo:SetInteger[Level, "${Level~}"]
jo:SetString[Tier, "${Tier~}"]
jo:SetInteger[HealthCost, "${HealthCost~}"]
jo:SetInteger[PowerCost, "${PowerCost~}"]
jo:SetInteger[DissonanceCost, "${DissonanceCost~}"]
jo:SetInteger[SavageryCost, "${SavageryCost~}"]
jo:SetInteger[ConcentrationCost, "${ConcentrationCost~}"]
jo:SetNumber[CastingTime, "${CastingTime~}"]
jo:SetNumber[RecoveryTime, "${RecoveryTime~}"]
jo:SetNumber[RecastTime, "${RecastTime~}"]
jo:SetNumber[MaxDuration, "${MaxDuration~}"]
jo:SetInteger[HealthCostPerTick, "${HealthCostPerTick~}"]
jo:SetInteger[PowerCostPerTick, "${PowerCostPerTick~}"]
jo:SetInteger[DissonanceCostPerTick, "${DissonanceCostPerTick~}"]
jo:SetInteger[SavageryCostPerTick, "${SavageryCostPerTick~}"]
jo:SetInteger[MaxAOETargets, "${MaxAOETargets~}"]
jo:SetBool[IsBeneficial, "${IsBeneficial~}"]
jo:SetBool[DoesNotExpire, "${DoesNotExpire~}"]
jo:SetBool[GroupRestricted, "${GroupRestricted~}"]
jo:SetBool[AllowRaid, "${AllowRaid~}"]
jo:SetInteger[TargetType, "${TargetType~}"]
jo:SetInteger[SpellBookType, "${SpellBookType~}"]
jo:SetNumber[MinRange, "${MinRange~}"]
jo:SetNumber[MaxRange, "${MaxRange~}"]
jo:Set[Effects, "${Effects.AsJSON~}"]
return jo
}
}
objectdef Ability
{
variable string Name
variable AbilityDetail Details
variable int HighestLevel
variable int CurrentID
method Initialize(jsonvalueref jo)
{
This:FromJSON[jo]
}
method FromJSON(jsonvalueref jo)
{
if !${jo.Type.Equal[object]}
{
echo "Ability:FromJson jo is not an object"
return FALSE
}
Name:Set["${jo.Get[Name]~}"]
CurrentID:Set[${jo.GetInteger["CurrentID"]}]
HighestLevel:Set[${jo.GetInteger["HighestLevel"]}]
Details:FromJSON["${jo.Get["Details"]~}"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="{}"
jo:SetString[Name, "${Name~}"]
jo:SetInteger[CurrentID, ${CurrentID}]
jo:SetInteger[HighestLevel, ${HighestLevel}]
jo:Set[Details, "${Details.AsJSON~}"]
return jo
}
}
objectdef KnowledgeBook
{
variable collection:Ability Abilities
method AddAbilityFromJSON(jsonvalueref jo)
{
variable StringHelpers stringHelpers
variable string abilityLine = "${stringHelpers.StripRomanNumerals[${jo.Get["Name"]}]}"
if ${jo.GetInteger["Level"]} < ${Abilities.Element["${abilityLine}"].HighestLevel}
{
return
}
variable jsonvalue tiers = "[]"
variable jsonvalue abilityLineJSON = "{}"
abilityLineJSON:SetValue[$$>"{
"Name": "${abilityLine~}",
"HighestLevel": ${jo.GetInteger["Level"]},
"CurrentID": ${jo.GetInteger["ID"]},
"Details": ${jo.AsJSON~}
}"<$$]
Abilities:Set["${abilityLine}", abilityLineJSON]
}
method FromFile(string filename)
{
variable jsonvalue jo
jo:ParseFile["${filename}"]
This:FromJSON[jo]
}
method WriteFile(string filename)
{
This.AsJSON:WriteFile["${filename}", multiline]
}
method AddAbilityLineFromJson(jsonvalueref jo)
{
if !${jo.Type.Equal[object]}
{
return FALSE
}
Abilities:Set[${jo.Get["Name"].AsJSON}, jo]
}
method FromJSON(jsonvalueref jo)
{
if !${jo.Type.Equal[array]}
{
echo "jo is not an array ${jo.Type}"
return FALSE
}
jo:ForEach["This:AddAbilityLineFromJson[ForEach.Value]"]
}
member:jsonvalueref AsJSON()
{
variable jsonvalue jo="[]"
variable iterator abilityIterator
Abilities:GetIterator[abilityIterator]
if ${abilityIterator:First(exists)}
{
do
{
jo:Add["${abilityIterator.Value.AsJSON~}"]
}
while ${abilityIterator:Next(exists)}
}
return jo
}
}

View File

@ -1,11 +1,22 @@
#ifndef _MR_STRING_HELPERS_
#define _MR_STRING_HELPERS_
objectdef MRStringHelpers
{
static member:string GetLastWord(string spellName)
;;;
;;; Returns the last word in a string
;;; @param str The string to get the last word from
;;; @return The last word in the string
static member:string GetLastWord(string str)
{
variable int tokenCount = ${spellName.Count[" "]}
return ${spellName.Token[${tokenCount:Inc}, " "].Trim}
variable int tokenCount = ${str.Count[" "]}
return ${str.Token[${tokenCount:Inc}, " "].Trim}
}
;;;
;;; Checks if the given string appears to be a roman numeral
;;; @param value The string to check
;;; @return TRUE if the string appears to be a roman numeral, FALSE otherwise
static member:bool IsRomanNumearl(string value)
{
variable int currentIndex
@ -20,18 +31,23 @@ objectdef MRStringHelpers
return TRUE
}
static member:string StripRomanNumerals(string spellName)
;;;
;;; Strips roman numerals from the end of a string, andy when working with spell names
;;; @param str The string to strip roman numerals from
;;; @return The string with roman numerals stripped from the end
static member:string StripRomanNumerals(string str)
{
variable string lastWord = ${MRStringHelpers.GetLastWord[${spellName}]}
variable string lastWord = ${MRStringHelpers.GetLastWord[${str}]}
if ${MRStringHelpers.IsRomanNumearl[${lastWord}]}
{
variable int baseStringLength
baseStringLength:Set[${spellName.Length} - ${lastWord.Length}]
return ${spellName.Mid[1, ${baseStringLength}].Trim}
baseStringLength:Set[${str.Length} - ${lastWord.Length}]
return ${str.Mid[1, ${baseStringLength}].Trim}
}
return ${spellName}
return ${str}
}
}
#endif