341 lines
14 KiB
XML
341 lines
14 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<script>
|
|
<name>LegacySpellConverter</name>
|
|
<code><![CDATA[import java.io.File;
|
|
import java.util.Iterator;
|
|
import net.sf.gridarta.gameobject.ArchetypeParser;
|
|
import net.sf.gridarta.gameobject.ArchetypeSet;
|
|
import net.sf.gridarta.gameobject.GameObject;
|
|
import net.sf.gridarta.io.RecursiveFileIterator;
|
|
import net.sf.gridarta.map.MapSquare;
|
|
|
|
int countMapFiles = 0;
|
|
int countSpellObjects = 0;
|
|
|
|
String[] spellMapping = {
|
|
"spell_magic_bullet", /* 0 */
|
|
"spell_small_fireball", /* 1 */
|
|
"spell_medium_fireball", /* 2 */
|
|
"spell_large_fireball", /* 3 */
|
|
"spell_burning_hands", /* 4 */
|
|
"spell_sm_lightning", /* 5 */
|
|
"spell_large_lightning", /* 6 */
|
|
"spell_magic_missile", /* 7 */
|
|
"spell_create_bomb", /* 8 */
|
|
"spell_summon_golem", /* 9 */
|
|
"spell_summon_fire_elemental", /* 10 */
|
|
"spell_summon_earth_elemental", /* 11 */
|
|
"spell_summon_water_elemental", /* 12 */
|
|
"spell_summon_air_elemental", /* 13 */
|
|
"spell_dimension_door", /* 14 */
|
|
"spell_create_earth_wall", /* 15 */
|
|
"spell_paralyze", /* 16 */
|
|
"spell_icestorm", /* 17 */
|
|
"spell_magic_mapping", /* 18 */
|
|
"spell_turn_undead", /* 19 */
|
|
"spell_fear", /* 20 */
|
|
"spell_poison_cloud", /* 21 */
|
|
"spell_wonder", /* 22 */
|
|
"spell_destruction", /* 23 */
|
|
"spell_perceive_self", /* 24 */
|
|
"spell_word_of_recall", /* 25 */
|
|
"spell_invisible", /* 26 */
|
|
"spell_invisible_to_undead", /* 27 */
|
|
"spell_probe", /* 28 */
|
|
"spell_lg_magic_bullet", /* 29 */
|
|
"spell_improved_invisibility", /* 30 */
|
|
"spell_holy_word", /* 31 */
|
|
"spell_minor_healing", /* 32 */
|
|
"spell_medium_healing", /* 33 */
|
|
"spell_major_healing", /* 34 */
|
|
"spell_heal", /* 35 */
|
|
"spell_create_food", /* 36 */
|
|
"spell_earth_to_dust", /* 37 */
|
|
"spell_armour", /* 38 */
|
|
"spell_strength", /* 39 */
|
|
"spell_dexterity", /* 40 */
|
|
"spell_constitution", /* 41 */
|
|
"spell_charisma", /* 42 */
|
|
"spell_create_fire_wall", /* 43 */
|
|
"spell_create_frost_wall", /* 44 */
|
|
"spell_protection_from_cold", /* 45 */
|
|
"spell_protection_from_electricity",/* 46 */
|
|
"spell_protection_from_fire", /* 47 */
|
|
"spell_protection_from_poison", /* 48 */
|
|
"spell_protection_from_slow", /* 49 */
|
|
"spell_protection_from_paralysis", /* 50 */
|
|
"spell_protection_from_draining", /* 51 */
|
|
"spell_protection_from_magic", /* 52 */
|
|
"spell_protection_from_attack", /* 53 */
|
|
"spell_levitate", /* 54 */
|
|
"spell_small_speedball", /* 55 */
|
|
"spell_large_speedball", /* 56 */
|
|
"spell_hellfire", /* 57 */
|
|
"spell_dragonbreath", /* 58 */
|
|
"spell_large_icestorm", /* 59 */
|
|
"spell_charging", /* 60 */
|
|
"spell_polymorph", /* 61 */
|
|
"spell_cancellation", /* 62 */
|
|
"spell_confusion", /* 63 */
|
|
"spell_mass_confusion", /* 64 */
|
|
"spell_summon_pet_monster", /* 65 */
|
|
"spell_slow", /* 66 */
|
|
"spell_regenerate_spellpoints", /* 67 */
|
|
"spell_cure_poison", /* 68 */
|
|
"spell_protection_from_confusion", /* 69 */
|
|
"spell_protection_from_cancellation",/* 70 */
|
|
"spell_protection_from_depletion", /* 71 */
|
|
"spell_alchemy", /* 72 */
|
|
"spell_remove_curse", /* 73 */
|
|
"spell_remove_damnation", /* 74 */
|
|
"spell_identify", /* 75*/
|
|
"spell_detect_magic", /* 76 */
|
|
"spell_detect_monster", /* 77 */
|
|
"spell_detect_evil", /* 78 */
|
|
"spell_detect_curse", /* 79 */
|
|
"spell_heroism", /* 80 */
|
|
"spell_aggravation", /* 81 */
|
|
"spell_firebolt", /* 82 */
|
|
"spell_frostbolt", /* 83 */
|
|
"spell_shockwave", /* 84 */
|
|
"spell_color_spray", /* 85 */
|
|
"spell_haste", /* 86 */
|
|
"spell_face_of_death", /* 87 */
|
|
"spell_ball_lightning", /* 88 */
|
|
"spell_meteor_swarm", /* 89 */
|
|
"spell_comet", /* 90 */
|
|
"spell_mystic_fist", /* 91 */
|
|
"spell_raise_dead", /* 92 */
|
|
"spell_resurrection", /* 93 */
|
|
"spell_reincarnation", /* 94 */
|
|
"spell_immunity_to_cold", /* 95 */
|
|
"spell_immunity_to_electricity", /* 96 */
|
|
"spell_immunity_to_fire", /* 97 */
|
|
"spell_immunity_to_poison", /* 98 */
|
|
"spell_immunity_to_slow", /* 99 */
|
|
"spell_immunity_to_paralysis", /* 100 */
|
|
"spell_immunity_to_draining", /* 101 */
|
|
"spell_immunity_to_magic", /* 102 */
|
|
"spell_immunity_to_attack", /* 103 */
|
|
"spell_invulnerability", /* 104 */
|
|
"spell_defense", /* 105 */
|
|
"spell_rune_of_fire", /* 106 */
|
|
"spell_rune_of_frost", /* 107 */
|
|
"spell_rune_of_shocking", /* 108 */
|
|
"spell_rune_of_blasting", /* 109 */
|
|
"spell_rune_of_death", /* 110 */
|
|
"spell_marking_rune", /* 111 */
|
|
"spell_build_director", /* 112 */
|
|
"spell_create_pool_of_chaos", /* 113 */
|
|
"spell_build_bullet_wall", /* 114 */
|
|
"spell_build_lightning_wall", /* 115 */
|
|
"spell_build_fireball_wall", /* 116 */
|
|
"spell_magic_rune", /* 117 */
|
|
"spell_rune_of_magic_drain", /* 118 */
|
|
"spell_antimagic_rune", /* 119 */
|
|
"spell_rune_of_transference", /* 120 */
|
|
"spell_transference", /* 121 */
|
|
"spell_magic_drain", /* 122 */
|
|
"spell_counterspell", /* 123 */
|
|
"spell_disarm", /* 124 */
|
|
"spell_cure_confusion", /* 125 */
|
|
"spell_restoration", /* 126 */
|
|
null, /* 127 */ /* Not implenented as nothing used it */
|
|
"spell_counterwall", /* 128 */
|
|
"spell_cause_light_wounds", /* 129 */
|
|
"spell_cause_medium_wounds", /* 130 */
|
|
"spell_cause_heavy_wounds", /* 131 */
|
|
"spell_charm_monsters", /* 132 */
|
|
"spell_banishment", /* 133 */
|
|
"spell_create_missile", /* 134 */
|
|
"spell_show_invisible", /* 135 */
|
|
"spell_xray", /* 136 */
|
|
"spell_pacify", /* 137 */
|
|
"spell_summon_fog", /* 138 */
|
|
"spell_steambolt", /* 139 */
|
|
"spell_command_undead", /* 140 */
|
|
"spell_holy_orb", /* 141 */
|
|
"spell_summon_avatar", /* 142 */
|
|
"spell_holy_possession", /* 143 */
|
|
"spell_bless", /* 144 */
|
|
"spell_curse", /* 145 */
|
|
"spell_regeneration", /* 146 */
|
|
"spell_consecrate", /* 147 */
|
|
"spell_summon_cult_monsters", /* 148 */
|
|
"spell_cause_critical_wounds", /* 149 */
|
|
"spell_holy_wrath", /* 150 */
|
|
"spell_retributive_strike", /* 151 */
|
|
"spell_finger_of_death", /* 152 */
|
|
"spell_insect_plague", /* 153 */
|
|
"spell_call_holy_servant", /* 154 */
|
|
"spell_wall_of_thorns", /* 155 */
|
|
"spell_staff_to_snake", /* 156 */
|
|
"spell_light", /* 157 */
|
|
"spell_darkness", /* 158 */
|
|
"spell_nightfall", /* 159 */
|
|
"spell_daylight", /* 160 */
|
|
"spell_sunspear", /* 161 */
|
|
"spell_faery_fire", /* 162 */
|
|
"spell_cure_blindness", /* 163 */
|
|
"spell_dark_vision", /* 164 */
|
|
"spell_bullet_swarm", /* 165 */
|
|
"spell_bullet_storm", /* 166 */
|
|
"spell_cause_many_wounds", /* 167 */
|
|
"spell_small_snowstorm", /* 168 */
|
|
"spell_medium_snowstorm", /* 169 */
|
|
"spell_large_snowstorm", /* 170 */
|
|
"spell_cure_disease", /* 171 */
|
|
"spell_cause_red_death", /* 172 */
|
|
"spell_cause_flu", /* 173 */
|
|
"spell_cause_black_death", /* 174 */
|
|
"spell_cause_leprosy", /* 175 */
|
|
"spell_cause_smallpox", /* 176 */
|
|
"spell_cause_white_death", /* 177 */
|
|
"spell_cause_anthrax", /* 178 */
|
|
"spell_cause_typhoid", /* 179 */
|
|
"spell_mana_blast", /* 180 */
|
|
"spell_small_manaball", /* 181 */
|
|
"spell_medium_manaball", /* 182 */
|
|
"spell_large_manaball", /* 183 */
|
|
"spell_manabolt", /* 184 */
|
|
"spell_dancing_sword", /* 185 */
|
|
"spell_animate_weapon", /* 186 */
|
|
"spell_cause_cold", /* 187 */
|
|
"spell_divine_shock", /* 188 */
|
|
"spell_windstorm", /* 189 */
|
|
"spell_sanctuary", /* 190 */
|
|
"spell_peace", /* 191 */
|
|
"spell_spiderweb", /* 192 */
|
|
"spell_conflict", /* 193 */
|
|
"spell_rage", /* 194 */
|
|
"spell_forked_lightning", /* 195 */
|
|
"spell_poison_fog", /* 196 */
|
|
"spell_flaming_aura", /* 197 */
|
|
"spell_vitriol", /* 198 */
|
|
"spell_vitriol_splash", /* 199 */
|
|
"spell_iron_skin", /* 200 */
|
|
"spell_wrathful_eye", /* 201 */
|
|
"spell_town_portal", /* 202 */
|
|
"spell_missile_swarm", /* 203 */
|
|
"spell_cause_rabies", /* 204 */
|
|
"spell_glyph", /* 205 */
|
|
};
|
|
|
|
void convertGameObject(GameObject gameObject) {
|
|
Iterator it = gameObject.iterator();
|
|
while (it.hasNext()) {
|
|
GameObject invObject = it.next();
|
|
convertGameObject(invObject);
|
|
}
|
|
|
|
// conversion code based on Crossfire's server/common/loader.l
|
|
int type = gameObject.getTypeNo();
|
|
switch (type) {
|
|
case 5: // POTION
|
|
case 18: // ALTAR
|
|
case 31: // TRIGGER_ALTAR
|
|
case 154: // RUNE
|
|
if (gameObject.getAttributeInt("sp") == 0) {
|
|
// non-spellcasting object ==> skip
|
|
break;
|
|
}
|
|
//fallthrough
|
|
case 3: // ROD
|
|
case 35: // HORN
|
|
case 62: // FIREWALL
|
|
case 109: // WAND
|
|
case 111: // SCROLL
|
|
String spellAttribute = type == 62 ? "dam" : "sp";
|
|
|
|
if (!gameObject.iterator().hasNext()) {
|
|
int spellId = gameObject.getAttributeInt(spellAttribute);
|
|
if (spellId < 0 || spellId >= spellMapping.length || spellMapping[spellId] == null) {
|
|
print("invalid spell number " + spellId + " in object " + gameObject.getBestName() + " at " + gameObject.getMapX() + "/" + gameObject.getMapY());
|
|
} else {
|
|
GameObject spell = archetypeSet.getOrCreateArchetype(spellMapping[spellId]).createArch();
|
|
spell.postParseGameObject(0);
|
|
gameObject.addLast(spell);
|
|
countSpellObjects++;
|
|
}
|
|
}
|
|
|
|
gameObject.removeAttribute(spellAttribute);
|
|
if (gameObject.getArchetype().getAttributeString("randomitems").length() > 0) {
|
|
gameObject.setAttributeString("randomitems", "none");
|
|
} else {
|
|
gameObject.removeAttribute("randomitems");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void convertMap(File mapFile, String mapPath) {
|
|
print(mapPath);
|
|
|
|
mapControl = mapManager.openMapFile(mapFile, false);
|
|
if (mapControl == null) {
|
|
print("Cannot load map file");
|
|
return;
|
|
}
|
|
|
|
try {
|
|
mapControl.getMapModel().beginTransaction("spell conversion");
|
|
try {
|
|
Iterator it1 = mapControl.getAllSquares().iterator();
|
|
while (it1.hasNext()) {
|
|
MapSquare mapSquare = it1.next();
|
|
Iterator it2 = mapSquare.iterator();
|
|
while (it2.hasNext()) {
|
|
GameObject gameObject = it2.next();
|
|
convertGameObject(gameObject);
|
|
}
|
|
}
|
|
} finally {
|
|
mapControl.getMapModel().endTransaction();
|
|
}
|
|
|
|
if (mapControl.isModified()) {
|
|
countMapFiles++;
|
|
mapControl.save();
|
|
}
|
|
} finally {
|
|
mapManager.release(mapControl);
|
|
}
|
|
}
|
|
|
|
if (baseDirectory == null || baseDirectory.length() <= 0) {
|
|
baseDirectory = "/";
|
|
}
|
|
print("Converting spellcasting objects maps below " + baseDirectory + "...");
|
|
if (baseDirectory.endsWith("/")) {
|
|
baseDirectory = baseDirectory.substring(0, baseDirectory.length() - 1);
|
|
}
|
|
|
|
String mapDefaultFolder = globalSettings.getMapsDirectory().getPath();
|
|
String rootDirectory = mapDefaultFolder + baseDirectory;
|
|
Iterator it = new RecursiveFileIterator(new File(rootDirectory));
|
|
while (it.hasNext()) {
|
|
File file = it.next();
|
|
if (file.isFile()
|
|
&& file.getPath().startsWith(rootDirectory)
|
|
&& !file.getName().equalsIgnoreCase("README")
|
|
&& !file.getName().endsWith(".msg")) {
|
|
convertMap(file, file.getPath().substring(mapDefaultFolder.length()));
|
|
}
|
|
}
|
|
|
|
print("Done. Created " + countSpellObjects + " spell objects in " + countMapFiles + " map files.");]]></code>
|
|
<mode>
|
|
<autoboot>false</autoboot>
|
|
<bash>false</bash>
|
|
<filter>false</filter>
|
|
</mode>
|
|
<parameter>
|
|
<name>baseDirectory</name>
|
|
<description>Base Directory</description>
|
|
<type>MapPathParameter</type>
|
|
<value>/</value>
|
|
</parameter>
|
|
</script>
|
|
|