Build RuneBase and its attributes from the rune and compare them
Adds RuneBase(RuneTemplate, RuneBase): name from item_base_name, description from rune_dsc. type and subtype stay the static_rune_runebase values: they are server enums that don't map cleanly from rune_type/rune_sub_type (CLASS runes carry 0/2/3/5/256/289; the creation exclusive-group subtypes 1-10 leave out Blood Gift, the MaxIncrease chains and the hashed sub types). The requirement maps and effects are copied from the DB row until 2.5b/2.10. RuneBaseAttribute.getAttributesForRune builds attribute 0 from rune_creation_cost, 1-5 from rune_attr_adj, 6-10 from rune_max_attr_adj and 11-15 from item_attr_req. A static_rune_runebase comparator checks name and attributes against the JSON. Offline parity (scripts/p24.py, 315 runebase rows + 365 attribute rows vs the RUNE JSON): every row has a rune; all 365 DB attribute rows match. Differences: - name: 9 DB typos (Confesser, Theif, LagMaster, WP Dev, Exception Strength/ Dexterity/Constitution/Intelligence/Spirit) - attributes: 17 runes with no DB rows gain JSON values: base classes 2500-2503, Pet 2522, admin 2905/2907/2909/2911, guards 252621-252623, and creation cost on 250116, 250117, 250123-250125 - description: '' (or CSR text on 2901-2911) -> rune_dsc; nothing reads it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
98f09d0713
commit
83f57b4def
3 files changed
+112
No files matched your search
@@ -10,11 +10,15 @@
|
||||
package engine.objects;
|
||||
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.mbEnums;
|
||||
import engine.mbEnums.GameObjectType;
|
||||
import engine.parsers.objects.RuneTemplate;
|
||||
import engine.server.MBServerStatics;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
import java.util.HashMap;
|
||||
|
||||
|
||||
@@ -57,6 +61,33 @@ public class RuneBaseAttribute extends AbstractGameObject {
|
||||
this.runeBaseID = rs.getInt("RuneBaseID");
|
||||
}
|
||||
|
||||
// Attribute ids: 0 = rune_creation_cost, 1-5 = rune_attr_adj, 6-10 = rune_max_attr_adj,
|
||||
// 11-15 = item_attr_req; the AttributeType ordinals Strength..Spirit are 1-5.
|
||||
|
||||
public static ArrayList<RuneBaseAttribute> getAttributesForRune(RuneTemplate rune) {
|
||||
|
||||
ArrayList<RuneBaseAttribute> attributes = new ArrayList<>();
|
||||
|
||||
if (rune.rune_creation_cost != 0)
|
||||
attributes.add(new RuneBaseAttribute((short) MBServerStatics.RUNE_COST_ATTRIBUTE_ID, (short) rune.rune_creation_cost));
|
||||
|
||||
addAttributes(attributes, rune.rune_attr_adj, 0);
|
||||
addAttributes(attributes, rune.rune_max_attr_adj, 5);
|
||||
addAttributes(attributes, rune.item_attr_req, 10);
|
||||
|
||||
return attributes;
|
||||
}
|
||||
|
||||
private static void addAttributes(ArrayList<RuneBaseAttribute> attributes, EnumMap<mbEnums.AttributeType, Integer> values, int idOffset) {
|
||||
|
||||
for (mbEnums.AttributeType attributeType : values.keySet()) {
|
||||
if (values.get(attributeType) == 0)
|
||||
continue;
|
||||
|
||||
attributes.add(new RuneBaseAttribute((short) (attributeType.ordinal() + idOffset), values.get(attributeType).shortValue()));
|
||||
}
|
||||
}
|
||||
|
||||
public static void LoadAllAttributes() {
|
||||
DbManager.RuneBaseAttributeQueries.GET_ATTRIBUTES_FOR_RUNEBASE();
|
||||
|
||||
|
||||
Reference in new issue
Block a user