|  |  |  | @ -35,8 +35,7 @@ public class PowerActionParser {@@ -35,8 +35,7 @@ public class PowerActionParser { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         try { | 
			
		
	
		
			
				
					|  |  |  |  |             fileData = Files.readAllBytes(Paths.get(powerActionPath)); | 
			
		
	
		
			
				
					|  |  |  |  |         } catch ( | 
			
		
	
		
			
				
					|  |  |  |  |                 IOException e) { | 
			
		
	
		
			
				
					|  |  |  |  |         } catch (IOException e) { | 
			
		
	
		
			
				
					|  |  |  |  |             throw new RuntimeException(e); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -59,98 +58,114 @@ public class PowerActionParser {@@ -59,98 +58,114 @@ public class PowerActionParser { | 
			
		
	
		
			
				
					|  |  |  |  |         EffectDescription effectDescription; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         try { | 
			
		
	
		
			
				
					|  |  |  |  |         // Remove all lines that contain a # and leading/trailing blank lines
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Remove all lines that contain a # and leading/trailing blank lines
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         powerActionData = powerActionData.replaceAll("(?m)^(\\s*#.*|\\s*)\r?\n?", "").trim(); | 
			
		
	
		
			
				
					|  |  |  |  |             powerActionData = powerActionData.replaceAll("(?m)^(\\s*#.*|\\s*)\r?\n?", "").trim(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         String[] lineData = powerActionData.split("\n"); | 
			
		
	
		
			
				
					|  |  |  |  |             String[] lineData = powerActionData.split("\n"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // Parse effect entry header
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Parse effect entry header
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         Iterator<String> entryIterator = Arrays.stream(lineData).iterator(); | 
			
		
	
		
			
				
					|  |  |  |  |             Iterator<String> entryIterator = Arrays.stream(lineData).iterator(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         String headerLine = entryIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |         ArrayList<String> headerData = new ArrayList<>(); | 
			
		
	
		
			
				
					|  |  |  |  |             String headerLine = entryIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |             ArrayList<String> headerData = new ArrayList<>(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         Matcher matcher = STRSPLIT_REGEX.matcher(headerLine.trim()); | 
			
		
	
		
			
				
					|  |  |  |  |             Matcher matcher = STRSPLIT_REGEX.matcher(headerLine.trim()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         while (matcher.find()) | 
			
		
	
		
			
				
					|  |  |  |  |             headerData.add(matcher.group().trim()); | 
			
		
	
		
			
				
					|  |  |  |  |             while (matcher.find()) | 
			
		
	
		
			
				
					|  |  |  |  |                 headerData.add(matcher.group().trim()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         Iterator<String> headerIterator = headerData.iterator(); | 
			
		
	
		
			
				
					|  |  |  |  |             Iterator<String> headerIterator = headerData.iterator(); | 
			
		
	
		
			
				
					|  |  |  |  |             powerActionEntry.action_id = headerIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |             powerActionEntry.action_type = headerIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         powerActionEntry.action_id = headerIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |         powerActionEntry.action_type = headerIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         while (headerIterator.hasNext()) { | 
			
		
	
		
			
				
					|  |  |  |  |             effectDescription = new EffectDescription(); | 
			
		
	
		
			
				
					|  |  |  |  |             effectDescription.effect_id = headerIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |             effectDescription.level = Integer.parseInt(headerIterator.next()); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // Process key value pairs after header
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         while (entryIterator.hasNext()) { | 
			
		
	
		
			
				
					|  |  |  |  |             String lineValue = entryIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |             String[] lineValues = lineValue.split("="); | 
			
		
	
		
			
				
					|  |  |  |  |             String key = lineValues[0].trim(); | 
			
		
	
		
			
				
					|  |  |  |  |             String[] arguments; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             switch (key) { | 
			
		
	
		
			
				
					|  |  |  |  |                 case "BODYPARTS": | 
			
		
	
		
			
				
					|  |  |  |  |                     arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.bodyparts.add(Integer.parseInt(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |             switch (powerActionEntry.action_type) { | 
			
		
	
		
			
				
					|  |  |  |  |                 case "RemoveEffect": | 
			
		
	
		
			
				
					|  |  |  |  |                     effectDescription = new EffectDescription(); | 
			
		
	
		
			
				
					|  |  |  |  |                     effectDescription.effect_id = headerIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.effects.add(effectDescription); | 
			
		
	
		
			
				
					|  |  |  |  |                 case "CreateMob": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.arg1 = Integer.parseInt(headerIterator.next()); | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.arg2 = Integer.parseInt(headerIterator.next()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "FEMALEBODYPARTS": | 
			
		
	
		
			
				
					|  |  |  |  |                     arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.femaleBodyParts.add(Integer.parseInt(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |                 case "ApplyEffect": | 
			
		
	
		
			
				
					|  |  |  |  |                 case "DeferredPower ": | 
			
		
	
		
			
				
					|  |  |  |  |                     while (headerIterator.hasNext()) { | 
			
		
	
		
			
				
					|  |  |  |  |                         effectDescription = new EffectDescription(); | 
			
		
	
		
			
				
					|  |  |  |  |                         effectDescription.effect_id = headerIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |                         effectDescription.level = Integer.parseInt(headerIterator.next()); | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.effects.add(effectDescription); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "SCALEFACTOR": | 
			
		
	
		
			
				
					|  |  |  |  |                     arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.scaleFactor.add(Float.parseFloat(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "ISRESISTABLE": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.isResistable = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "ISAGGRESSIVE": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.isAggressive = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "BLADETRAILS": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.bladeTrails = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "SHOULDSHOWWEAPONS": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.shouldShowWeapons = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "SHOULDSHOWARMOR": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.shouldShowArmor = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "APPLYEFFECTBLANK": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.applyEffectBlank = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "WEAROFFEFFECTBLANK": | 
			
		
	
		
			
				
					|  |  |  |  |                     powerActionEntry.wearOffEffectBlank = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "ATTACKANIMS": | 
			
		
	
		
			
				
					|  |  |  |  |                     arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.attackAnimations.add(Integer.parseInt(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 case "WEAROFFEFFECTOTHER": // Keys not parsed go here.
 | 
			
		
	
		
			
				
					|  |  |  |  |                 case "WEAROFFEFFECTSELF": | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |                 default: | 
			
		
	
		
			
				
					|  |  |  |  |                     Logger.error("Unhandled variable type:" + key + " for powerAction: " + powerActionEntry.action_id); | 
			
		
	
		
			
				
					|  |  |  |  |                     Logger.error("Unhandled type " + powerActionEntry.action_type + " for Pow4erAction: " + powerActionEntry.action_id); | 
			
		
	
		
			
				
					|  |  |  |  |                     break; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |             // Process key value pairs after header
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             while (entryIterator.hasNext()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 String lineValue = entryIterator.next(); | 
			
		
	
		
			
				
					|  |  |  |  |                 String[] lineValues = lineValue.split("="); | 
			
		
	
		
			
				
					|  |  |  |  |                 String key = lineValues[0].trim(); | 
			
		
	
		
			
				
					|  |  |  |  |                 String[] arguments; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 switch (key) { | 
			
		
	
		
			
				
					|  |  |  |  |                     case "BODYPARTS": | 
			
		
	
		
			
				
					|  |  |  |  |                         arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                         for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                             powerActionEntry.bodyparts.add(Integer.parseInt(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "FEMALEBODYPARTS": | 
			
		
	
		
			
				
					|  |  |  |  |                         arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                         for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                             powerActionEntry.femaleBodyParts.add(Integer.parseInt(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "SCALEFACTOR": | 
			
		
	
		
			
				
					|  |  |  |  |                         arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                         for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                             powerActionEntry.scaleFactor.add(Float.parseFloat(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "ISRESISTABLE": | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.isResistable = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "ISAGGRESSIVE": | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.isAggressive = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "BLADETRAILS": | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.bladeTrails = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "SHOULDSHOWWEAPONS": | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.shouldShowWeapons = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "SHOULDSHOWARMOR": | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.shouldShowArmor = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "APPLYEFFECTBLANK": | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.applyEffectBlank = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "WEAROFFEFFECTBLANK": | 
			
		
	
		
			
				
					|  |  |  |  |                         powerActionEntry.wearOffEffectBlank = Boolean.parseBoolean(lineValues[1].trim()); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "ATTACKANIMS": | 
			
		
	
		
			
				
					|  |  |  |  |                         arguments = lineValues[1].trim().split("\\s+"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                         for (String bodyPart : arguments) | 
			
		
	
		
			
				
					|  |  |  |  |                             powerActionEntry.attackAnimations.add(Integer.parseInt(bodyPart)); | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     case "WEAROFFEFFECTOTHER": // Keys not parsed go here.
 | 
			
		
	
		
			
				
					|  |  |  |  |                     case "WEAROFFEFFECTSELF": | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     default: | 
			
		
	
		
			
				
					|  |  |  |  |                         Logger.error("Unhandled variable type:" + key + " for powerAction: " + powerActionEntry.action_id); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } catch (Exception e) { | 
			
		
	
		
			
				
					|  |  |  |  |             Logger.error(powerActionEntry.action_id + " " + e); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |