maps/editor/scripts/LegacySpellConverter

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>