Last active
April 26, 2024 18:31
-
-
Save PlugFox/31069d30374670557a023c557793f121 to your computer and use it in GitHub Desktop.
rAthena Warper to OpenKore portals.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* rAthena Warper to OpenKore portals.txt | |
* https://gist.github.com/PlugFox/31069d30374670557a023c557793f121 | |
* https://dartpad.dev?id=31069d30374670557a023c557793f121 | |
* Mike Matiunin <plugfox@gmail.com>, 26 April 2024 | |
*/ | |
// ignore_for_file: avoid_print, lines_longer_than_80_chars, curly_braces_in_flow_control_structures | |
void main() { | |
const sourceCoordinate = 'prontera 159 192'; | |
final buffer = StringBuffer(); | |
void divide(String label) => buffer | |
..writeln() | |
..writeln() | |
..writeln('#' * 50) | |
..writeln('##### $label') | |
..writeln(); | |
void Function(ResultEntry e) writer(int idx) => (e) { | |
if (e.select) { | |
for (final item in e.items) { | |
buffer | |
..write(sourceCoordinate) | |
..write(' ') | |
..write(item.map) | |
..write(' ') | |
..write(item.x) | |
..write(' ') | |
..write(item.y) | |
..writeln(' 0 c r$idx r${e.idx} r${item.idx}'); | |
} | |
} else { | |
buffer | |
..write(sourceCoordinate) | |
..write(' ') | |
..write(e.items.single.map) | |
..write(' ') | |
..write(e.items.single.x) | |
..write(' ') | |
..write(e.items.single.y) | |
..writeln(' 0 c r$idx r${e.idx}'); | |
} | |
}; | |
try { | |
divide('Cities'); | |
parse($cities, prefix: 'T').forEach(writer(1)); | |
divide('Fields'); | |
parse($fields, prefix: 'F').forEach(writer(2)); | |
divide('Dungeons'); | |
parse($dungeons, prefix: 'D').forEach(writer(3)); | |
divide('Guild Castles'); | |
parse($castles, prefix: 'C').forEach(writer(4)); | |
divide('Guild Dungeons'); | |
parse($guildDungeons, prefix: 'G').forEach(writer(5)); | |
divide('Instances'); | |
parse($instances, prefix: 'G').forEach(writer(6)); | |
divide('Special Areas'); | |
parse($special, prefix: 'S').forEach(writer(7)); | |
print(buffer.toString().trim()); | |
} on Object catch (e) { | |
print(e); | |
} | |
} | |
/// Entry | |
typedef ResultEntry = ({int idx, bool select, List<({int idx, String map, int x, int y})> items}); | |
/// ------------------- Functions ------------------- | |
/// * Go("<map>",<x>,<y>); | |
/// ~ Warps directly to a map. | |
/// | |
/// * Disp("<Menu Option>",<first option>,<last option>); | |
/// * Pick("<map_prefix>"{,<index offset>}); | |
/// ~ Dynamic menu and map selection (auto-numbered). | |
/// ~ Fields and Dungeons must use Disp and Pick Functions. | |
/// | |
/// * Disp("<Option 1>:<Option 2>:<etc.>"); | |
/// * Pick("","<map1>","<map2>","<etc.>"); | |
/// ~ Manual menu and map selection (listed). | |
/// | |
/// * Restrict("<RE | Pre-RE>"{,<menu option numbers>}); | |
/// ~ Only allows map for Renewal or Pre-Renewal modes. | |
/// If menu option numbers are given, only those maps | |
/// will be restricted (i.e. not for "Go"). | |
/// | |
/// Other notes: | |
/// ~ Array @c[] holds all (x,y) coordinates. | |
/// ~ Use @c[2] EXCEPT when maps begin dynamically | |
/// at 0: use @c[0] and Pick() offset 1. | |
/// -------------------------------------------------- | |
List<ResultEntry> parse(String text, {required String prefix}) { | |
final rows = text.replaceAll('\n', ' ').split(';').map((e) => e.trim()).toList(growable: false); | |
if (rows.isEmpty) throw Exception('No data found'); | |
Iterable<({int x, int y})> parseCoordinates(String data) sync* { | |
final regExp = RegExp(r'setarray @c\[\d\],([\d,]+);'); | |
final matches = regExp.allMatches(data).expand((e) => e.group(1)!.split(',')).toList(growable: false); | |
for (var i = 0; i < matches.length; i += 2) { | |
yield (x: int.parse(matches[i]), y: int.parse(matches[i + 1])); | |
} | |
} | |
int? option; | |
final data = <String>[]; | |
final entries = <int, String>{}; | |
void finish() { | |
data | |
// ..removeWhere((element) => element.startsWith('Restrict')) | |
.removeWhere((element) => element.isEmpty); | |
if (option == null || data.isEmpty) return; | |
entries[option!] = data.join('; '); | |
option = null; | |
data.clear(); | |
} | |
final beginOfEntryRegExp = RegExp('$prefix' r'\d+:'); | |
for (final r in rows) { | |
if (r.startsWith(beginOfEntryRegExp)) { | |
finish(); | |
if (r.contains('Restrict("RE")')) continue; | |
final value = int.tryParse(r.substring(prefix.length, r.indexOf(':'))); | |
if (value == null) continue; | |
option = value - 1; | |
data.add(r.substring(r.indexOf(':') + 1).trim()); | |
} else if (option != null) { | |
data.add(r.trim()); | |
} | |
} | |
finish(); | |
final result = <ResultEntry>[]; | |
for (final entry in entries.entries) { | |
final MapEntry<int, String>(key: option, value: row) = entry; | |
if (row.contains('Restrict("RE")')) throw Exception('Restrict("RE") unallowed for $option'); | |
final exclude = <int>[]; | |
final restrict = RegExp(r'Restrict\("RE"\s*(,\s*\d+)\s*\);').allMatches(row); | |
if (restrict.isNotEmpty) { | |
exclude.addAll(restrict.single | |
.group(1)! | |
.replaceAll(',', ' ') | |
.split(' ') | |
.where((e) => e.isNotEmpty) | |
.map((e) => int.parse(e.trim()))); | |
} | |
if (row.contains('Go(')) { | |
final regExp = RegExp(r'Go\("([0-9a-z_]+)",\s*(\d+),\s*(\d+)\)'); | |
final matches = regExp.allMatches(row); | |
final match = matches.single; | |
final map = match.group(1)!; | |
final x = int.parse(match.group(2)!); | |
final y = int.parse(match.group(3)!); | |
result.add((idx: option, select: false, items: [(idx: -1, map: map, x: x, y: y)])); | |
continue; | |
} | |
if (!row.contains('Disp(')) throw Exception('Unsupported format for $option'); | |
if (!row.contains('Pick(')) throw Exception('Unsupported format for $option'); | |
final coordinates = parseCoordinates(row).toList(growable: false); | |
if (coordinates.isEmpty) throw Exception('No coordinates found for $option'); | |
if (row.contains('Pick("",')) { | |
final maps = row | |
.substring(row.indexOf('Pick("",') + 8, row.lastIndexOf('")')) | |
.split(',') | |
.map((e) => e.trim().replaceAll('"', '')) | |
.where((e) => e.isNotEmpty) | |
.toList(growable: false); | |
if (maps.isEmpty) throw Exception('No maps found for $option'); | |
if (maps.length != coordinates.length) throw Exception('Invalid range for $option'); | |
final list = <({int idx, String map, int x, int y})>[]; | |
for (var idx = 0; idx < maps.length; idx++) { | |
list.add((idx: idx, map: maps[idx], x: coordinates[idx].x, y: coordinates[idx].y)); | |
} | |
result.add((idx: option, select: true, items: list)); | |
} else { | |
/* final range = RegExp(r'Disp\(".+",(\d+),(\d+)\)').firstMatch(row); | |
if (range == null) throw Exception('Invalid range for $option'); | |
final first = int.parse(range.group(1)!); | |
final last = int.parse(range.group(2)!); | |
if (coordinates.length != last - first + 1) { | |
throw Exception('Invalid range for $option'); | |
} */ | |
final baseMap = RegExp(r'Pick\("(.+)"').allMatches(row).single.group(1)!; | |
final offsetMatches = RegExp(r'Pick\("[0-9a-z_]+",\s*(\d+)\)').allMatches(row); | |
final offset = offsetMatches.isEmpty ? 0 : int.parse(offsetMatches.single.group(1)!); | |
final list = <({int idx, String map, int x, int y})>[]; | |
for (var idx = 0; idx < coordinates.length; idx++) { | |
final map = '$baseMap${(idx + 1 - offset).toString().padLeft(2, '0')}'; | |
list.add((idx: idx, map: map, x: coordinates[idx].x, y: coordinates[idx].y)); | |
} | |
for (final e in exclude) { | |
for (var i = list.length - 1; i >= 0; i--) { | |
if (list[i].idx != e) continue; | |
list.removeAt(i); | |
} | |
} | |
result.add((idx: option, select: true, items: list)); | |
} | |
} | |
return result; | |
} | |
/// -------------------------------------------------- | |
/// Cities: | |
/// -------------------------------------------------- | |
const String $cities = ''' | |
T1: Go("prontera",155,183); | |
T2: Go("alberta",28,234); | |
T3: Go("aldebaran",140,131); | |
T4: Go("amatsu",198,84); | |
T5: Go("ayothaya",208,166); | |
T6: Restrict("RE"); | |
Go("brasilis",196,217); | |
T7: Go("comodo",209,143); | |
T8: Restrict("RE"); | |
Go("dewata",200,180); | |
T9: Restrict("RE"); | |
Go("ecl_in01",48,53); | |
T10: Go("einbech",63,35); | |
T11: Go("einbroch",64,200); | |
T12: Restrict("RE"); | |
Go("dicastes01",198,187); | |
T13: Go("geffen",119,59); | |
T14: Go("hugel",96,145); | |
T15: Restrict("RE"); | |
Go("icecastle",185,212); | |
T16: Go("izlude",128, 146); | |
T17: Go("jawaii",251,132); | |
T18: Go("yuno",157,51); | |
T19: Go("gonryun",160,120); | |
T20: Restrict("RE"); | |
Go("lasagna",193,182); | |
T21: Go("lighthalzen",158,92); | |
T22: Go("louyang",217,100); | |
T23: Go("xmas",147,134); | |
T24: Restrict("RE"); | |
Go("malangdo",140,114); | |
T25: Restrict("RE"); | |
Go("malaya",231,200); | |
T26: Go("manuk",282,138); | |
T27: Go("mid_camp",210,288); | |
T28: Restrict("RE"); | |
Go("mora",55,146); | |
T29: Go("morocc",156,93); | |
T30: Go("moscovia",223,184); | |
T31: Go("nameless_i",256,215); | |
T32: Go("nameless_n",256,215); | |
T33: Go("niflheim",202,174); | |
T34: Go("payon",179,100); | |
T35: Go("rachel",130,110); | |
T36: Restrict("RE"); | |
Go("harboro1",298,206); | |
T37: Restrict("RE"); | |
Go("sp_cor",160,166); | |
T38: Go("splendide",201,147); | |
T39: Go("thor_camp",246,68); | |
T40: Go("umbala",97,153); | |
T41: Restrict("RE"); | |
Go("ba_maison",72,146); | |
T42: Go("veins",216,123); | |
T43: Restrict("RE"); | |
Go("verus04",123,250); | |
T44: Restrict("RE"); | |
Go("wolfvill",144,144); | |
'''; | |
/// -------------------------------------------------- | |
/// Fields: | |
/// -------------------------------------------------- | |
const $fields = ''' | |
F1: setarray @c[2],190,197; | |
Disp("Amatsu Field",1,1); Pick("ama_fild"); | |
F2: setarray @c[2],173,134,212,150; | |
Disp("Ayothaya Field",1,2); Pick("ayo_fild"); | |
F3: Restrict("RE"); | |
setarray @c[2],193,220,220,187; | |
Disp("Bifrost Field",1,2); Pick("bif_fild"); | |
F4: Restrict("RE"); | |
setarray @c[2],74,32; | |
Disp("Brasilis Field",1,1); Pick("bra_fild"); | |
F5: Restrict("Pre-RE",5); | |
setarray @c[2],180,178,231,160,191,172,228,194,224,203,190,223,234,177,194,175,172,172; | |
Disp("Comodo Field",1,9); Pick("cmd_fild"); | |
F6: Restrict("RE"); | |
setarray @c[2],371,212; | |
Disp("Dewata Field",1,1); Pick("dew_fild"); | |
F7: Restrict("RE"); | |
setarray @c[2],97,314; | |
Disp("Eclage Field",1,1); Pick("ecl_fild"); | |
F8: Restrict("Pre-RE",2,10); | |
setarray @c[2],142,225,182,141,187,228,185,173,216,173,195,148,272,220,173,214,207,174,196,200; | |
Disp("Einbroch Field",1,10); Pick("ein_fild"); | |
F9: Restrict("RE"); | |
setarray @c[2],143,132,143,217; | |
Disp("El Dicastes Field",1,2); Pick("dic_fild"); | |
F10: Restrict("RE"); | |
setarray @c[2],378,223,223,18,365,241,140,280; | |
Disp("Frozen Scale Hill:Frozen Scale Plains:Frozen Scale Glacier:Frozen Tail"); Pick("","jor_back1","jor_back2","jor_back3","jor_tail"); | |
F11: Restrict("Pre-RE",13,15); | |
setarray @c[0],46,199,213,204,195,212,257,192,188,171,166,263,248,158,195,191,186,183,221,117,178,218,136,328,240,181,235,235,211,185; | |
Disp("Geffen Field",0,14); Pick("gef_fild",1); | |
F12: Restrict("RE"); | |
setarray @c[2],22,315,122,388; | |
Disp("Grey Wolf Forest",1,2); Pick("gw_fild"); | |
F13: Restrict("Pre-RE",3,7); | |
setarray @c[2],268,101,222,193,232,185,252,189,196,106,216,220,227,197; | |
Disp("Hugel Field",1,7); Pick("hu_fild"); | |
F14: Restrict("Pre-RE",5,10); | |
setarray @c[2],189,224,192,207,221,157,226,199,223,177,187,232,231,174,196,203,183,214,200,124,195,226,210,304; | |
Disp("Juno Field",1,12); Pick("yuno_fild"); | |
F15: Restrict("RE"); | |
setarray @c[2],38,246,31,207; | |
Disp("Kiwawa Desert",1,2); Pick("","rockrdg1","rockrdg2"); | |
F16: setarray @c[2],220,227; | |
Disp("Kunlun Field",1,1); Pick("gon_fild"); | |
F17: Restrict("RE"); | |
setarray @c[2],344,371,20,98; | |
Disp("Lasagna Field",1,2); Pick("lasa_fild"); | |
F18: setarray @c[2],240,179,185,235,240,226; | |
Disp("Lighthalzen Field",1,3); Pick("lhz_fild"); | |
F19: setarray @c[2],229,187; | |
Disp("Luoyang Field",1,1); Pick("lou_fild"); | |
F20: setarray @c[2],115,145; | |
Disp("Lutie Field",1,1); Pick("xmas_fild"); | |
F21: Restrict("RE"); | |
setarray @c[2],40,272,207,180; | |
Disp("Malaya Field",1,2); Pick("ma_fild"); | |
F22: setarray @c[2],35,236,35,262,84,365; | |
Disp("Manuk Field",1,3); Pick("man_fild"); | |
F23: setarray @c[2],204,120,175,193,208,213,179,180,181,240,195,270,235,202,188,215,205,144,245,223,180,206,196,208; | |
Disp("Mjolnir Field",1,12); Pick("mjolnir_"); | |
F24: setarray @c[2],82,104,131,147; | |
Disp("Moscovia Field",1,2); Pick("mosk_fild"); | |
F25: setarray @c[2],215,229,167,234; | |
Disp("Niflheim Field",1,2); Pick("nif_fild"); | |
F26: Restrict("Pre-RE",5,11); | |
setarray @c[2],158,206,151,219,205,148,186,247,134,204,193,235,200,177,137,189,201,224,160,205,194,150; | |
Disp("Payon Forest",1,11); Pick("pay_fild"); | |
F27: setarray @c[0],208,227,190,206,240,206,190,143,307,252,239,213,185,188,193,194,187,218,210,183,195,149,198,164; | |
Disp("Prontera Field",0,11); Pick("prt_fild",1); | |
F28: Restrict("Pre-RE",2,7,9,10,11,13); | |
setarray @c[2],192,162,235,166,202,206,202,208,225,202,202,214,263,196,217,201,87,121,277,181,221,185,175,200,174,197; | |
Disp("Rachel Field",1,13); Pick("ra_fild"); | |
F29: setarray @c[2],219,205,177,206,194,182,224,170,198,216,156,187,185,263,206,228,208,238,209,223,85,97,207,202,31,195,38,195; | |
Disp("Sograt Desert 1:Sograt Desert 2:Sograt Desert 3:Sograt Desert 7:Sograt Desert 11:Sograt Desert 12:Sograt Desert 13:Sograt Desert 16:Sograt Desert 17:Sograt Desert 18:Sograt Desert 19:Sograt Desert 20:Sograt Desert 21:Sograt Desert 22"); | |
Pick("","moc_fild01","moc_fild02","moc_fild03","moc_fild07","moc_fild11","moc_fild12","moc_fild13","moc_fild16","moc_fild17","moc_fild18","moc_fild19","moc_fild20","moc_fild21","moc_fild22"); | |
F30: setarray @c[2],175,186,236,184,188,204; | |
Disp("Splendide Field",1,3); Pick("spl_fild"); | |
F31: setarray @c[2],217,206,223,221,237,215,202,197; | |
Disp("Umbala Field",1,4); Pick("um_fild"); | |
F32: Restrict("Pre-RE",5); | |
setarray @c[2],186,175,196,370,222,45,51,250,202,324,150,223,149,307; | |
Disp("Veins Field",1,7); Pick("ve_fild"); | |
'''; | |
/// -------------------------------------------------- | |
/// Dungeons: | |
/// -------------------------------------------------- | |
const $dungeons = ''' | |
D1: Restrict("RE"); | |
setarray @c[2],253,244,145,278; | |
Disp("1st Floor - Comprehensive Lab:2nd Floor - Intensive Culture Room"); Pick("","amicitia1","amicitia2"); | |
D2: Restrict("RE",4); | |
setarray @c[2],261,272,275,270,116,27,169,159; | |
Disp("Abyss Lakes",1,4); Pick("abyss_"); | |
D3: setarray @c[2],228,11,34,41,119,14; | |
Disp("Amatsu Dungeon",1,3); Pick("ama_dun"); | |
D4: setarray @c[2],35,262,168,170; | |
Disp("Anthell",1,2); Pick("anthell"); | |
D5: setarray @c[2],275,19,24,26; | |
Disp("Ancient Shrine Maze:Inside Ancient Shrine"); Pick("ayo_dun"); | |
D6: setarray @c[2],266,67,255,244,23,260; | |
Disp("Beach Dungeon",1,3); Pick("","beach_dun","beach_dun2","beach_dun3"); | |
D7: Restrict("RE"); | |
setarray @c[2],57,13,64,88,45,14,26,23; | |
Disp("Bifrost Tower",1,4); Pick("ecl_tdun"); | |
D8: Restrict("RE",4,5); | |
setarray @c[2],150,288,150,18,140,134,244,52,100,202; | |
Disp("Bio Lab 1:Bio Lab 2:Bio Lab 3:Bio Lab 4:Tomb of the Fallen"); Pick("","lhz_dun01","lhz_dun02","lhz_dun03","lhz_dun04","lhz_dun_n"); | |
D9: Restrict("RE"); | |
setarray @c[2],87,47,262,262; | |
Disp("Brasilis Dungeon",1,2); Pick("bra_dun"); | |
D10: Restrict("RE",6); | |
setarray @c[0],168,168,253,252,236,204,32,63,26,27,141,187; | |
Disp("Byalan Dungeon",1,6); Pick("iz_dun",1); | |
D11: Restrict("RE",9,10,11); | |
setarray @c[2],199,159,148,283,65,147,56,155,297,25,127,169,277,178,268,74,266,27,60,142,79,39; | |
Disp("Clock Tower 1:Clock Tower 2:Clock Tower 3:Clock Tower 4:Basement 1:Basement 2:Basement 3:Basement 4:Nightmare Clock Tower, 2nd Floor:Nightmare Clock Tower, 3rd Floor:Unknown Basement"); | |
Pick("","c_tower1","c_tower2","c_tower3","c_tower4","alde_dun01","alde_dun02","alde_dun03","alde_dun04","c_tower2_","c_tower3_","clock_01"); | |
D12: setarray @c[2],52,17,381,343,302,262; | |
Disp("Coal Mines",1,3); Pick("mjo_dun"); | |
D13: setarray @c[2],131,247,19,19,180,169,100,92; | |
Disp("Culvert",1,4); Pick("","prt_sewb1","prt_sewb2","prt_sewb3","prt_sewb4"); | |
D14: setarray @c[2],51,14,150,11,120,10; | |
Disp("Cursed Abbey",1,3); Pick("abbey"); | |
D15: Restrict("RE"); | |
setarray @c[2],285,160,299,29; | |
Disp("Dewata Dungeon",1,2); Pick("dew_dun"); | |
D16: Restrict("RE",3); | |
setarray @c[2],22,14,292,290,269,279; | |
Disp("Einbroch Dungeon",1,3); Pick("ein_dun"); | |
D17: Restrict("RE"); | |
Go("moro_vol",97,107); | |
D18: setarray @c[2],40,103,203,34,266,168,130,272; | |
Disp("Gefenia",1,4); Pick("gefenia",0); | |
D19: setarray @c[0],104,99,115,236,106,132,203,200; | |
Disp("Geffen Dungeon",1,4); Pick("gef_dun",1); | |
D20: Restrict("RE",17,18,19); | |
setarray @c[2],370,304,199,29,104,25,150,15,157,287,147,15,258,255,108,291,171,283,68,277,156,7,12,7,133,271,224,274,14,70,150,14,104,31,148,144,199,29; | |
Disp("Entrance:Castle 1:Castle 2:Chivalry 1:Chivalry 2:Churchyard:Culvert 1:Culvert 2:Culvert 3:Culvert 4:St. Abbey:Staircase Dungeon:Underground Cave 1:Underground Cave 2:Underground Prison 1:Underground Prison 2:Castle 2 - Nightmare Mode:Churchyard - Nightmare Mode:Abyss Glastheim Castle F1"); | |
Pick("","glast_01","gl_cas01","gl_cas02","gl_knt01","gl_knt02","gl_chyard","gl_sew01","gl_sew02","gl_sew03","gl_sew04","gl_church","gl_step","gl_dun01","gl_dun02","gl_prison","gl_prison1","gl_cas02_","gl_chyard_","gl_cas01_"); | |
D21: setarray @c[2],99,31,93,20,182,88; | |
Disp("Hidden Dungeon",1,3); Pick("prt_maze"); | |
D22: setarray @c[2],157,14,151,155,149,22,33,158; | |
Disp("Ice Dungeon",1,4); Pick("ice_dun"); | |
D24: Restrict("RE"); | |
setarray @c[2],112,15,280,87,112,12,274,85; | |
Disp("Abandoned Pit Floor 1:Abandoned Pit Floor 2:Snake God's Warmth 1st Floor:Snake God's Warmth 2nd Floor"); Pick("","jor_ab01","jor_ab02","jor_dun01","jor_dun02"); | |
D25: Restrict("RE",5); | |
setarray @c[2],140,51,53,247,37,63,150,285,146,215; | |
Disp("Entrance:Juperos 1:Juperos 2:Core:Eastern Ruins of Juperos"); | |
Pick("","jupe_cave","juperos_01","juperos_02","jupe_core","ver_eju"); | |
D26: setarray @c[2],28,226,41,198; | |
Disp("Kiel Dungeon",1,2); Pick("kh_dun"); | |
D27: setarray @c[2],153,53,28,113,68,16; | |
Disp("Kunlun Dungeon",1,3); Pick("gon_dun"); | |
D28: Restrict("RE"); | |
setarray @c[2],24,143,22,171,190,18; | |
Disp("Lasagna Dungeon",1,3); Pick("lasa_dun"); | |
D29: setarray @c[2],218,196,282,20,165,38; | |
Disp("The Royal Tomb:Inside the Royal Tomb:Suei Long Gon"); Pick("lou_dun"); | |
D30: Restrict("RE",3); | |
setarray @c[2],126,68,47,30,118,113; | |
Disp("Magma Dungeon",1,3); Pick("mag_dun"); | |
D31: Restrict("RE"); | |
setarray @c[2],33,230; | |
Disp("Malangdo Dungeon",1,1); Pick("mal_dun"); | |
D32: setarray @c[2],189,48,165,30,32,135; | |
Disp("Moscovia Dungeon",1,3); Pick("mosk_dun"); | |
D33: setarray @c[2],61,239,60,271; | |
Disp("Nidhogg's Dungeon",1,2); Pick("nyd_dun"); | |
D34: Restrict("RE"); | |
setarray @c[2],145,90,150,20; | |
Disp("Niflheim Dungeon - 1st Floor:Niflheim Dungeon - 2nd Floor"); Pick("nif_dun"); | |
D35: Restrict("RE",4); | |
setarray @c[2],298,167,224,149,266,280,276,236; | |
Disp("Odin Temple 1:Odin Temple 2:Odin Temple 3:Odin Past"); Pick("","odin_tem01","odin_tem02","odin_tem03","odin_past"); | |
D36: setarray @c[2],32,170,21,185; | |
Disp("Orc Dungeon",1,2); Pick("orcsdun"); | |
D37: Restrict("RE"); | |
setarray @c[2],21,191,141,277; | |
Disp("Oz Labyrinth Floor 1:Oz Labyrinth Floor 2"); Pick("oz_dun"); | |
D38: setarray @c[0],21,183,19,33,19,63,155,159,201,204; | |
Disp("Payon Dungeon",1,5); Pick("pay_dun",1); | |
D39: Restrict("RE"); | |
setarray @c[2],159,289,155,353; | |
Disp("Prontera Underground Prison:Prontera Invasion"); Pick("","prt_prison","prt_q"); | |
D40: Restrict("RE",7,8); | |
setarray @c[2],192,9,10,192,100,92,181,11,94,96,192,8,94,96,192,8; | |
Disp("Pyramids 1:Pyramids 2:Pyramids 3:Pyramids 4:Basement 1:Basement 2:Basement 1 - Nightmare Mode:Basement 2 - Nightmare Mode"); | |
Pick("","moc_pryd01","moc_pryd02","moc_pryd03","moc_pryd04","moc_pryd05","moc_pryd06","moc_prydn1","moc_prydn2"); | |
D41: setarray @c[2],140,11,32,21,8,149,204,218,150,9; | |
Disp("Rachel Sanctuary",1,5); Pick("ra_san"); | |
D42: Restrict("RE"); | |
setarray @c[2],247,19,281,104; | |
Disp("Rock Ridge Mine:Underground Waterway Culvert"); Pick("","rockmi1","harboro2"); | |
D43: Restrict("RE"); | |
setarray @c[2],200,377,185,258,366,207,378,178; | |
Disp("Rudus Dungeon",1,4); Pick("","sp_rudus","sp_rudus2","sp_rudus3","sp_rudus4"); | |
D44: Restrict("RE"); | |
setarray @c[2],364,44,101,141,101,141; | |
Disp("Scaraba Hole",1,3); Pick("dic_dun"); | |
D45: setarray @c[2],288,9,149,81,210,54,10,222,100,99; | |
Disp("Sphinx",1,5); Pick("","in_sphinx1","in_sphinx2","in_sphinx3","in_sphinx4","in_sphinx5"); | |
D46: setarray @c[2],69,24,102,27; | |
Disp("Sunken Ship",1,2); Pick("treasure"); | |
D47: setarray @c[2],150,39,150,136,220,158,59,143,62,11,89,221,35,166,93,148,29,107,159,138,19,20,130,52; | |
Disp("Thanatos Tower",1,12); Pick("tha_t"); | |
D48: setarray @c[2],21,228,75,205,34,272; | |
Disp("Thor Volcano",1,3); Pick("thor_v"); | |
D49: setarray @c[2],205,15,129,133; | |
Disp("Toy Factory",1,2); Pick("xmas_dun"); | |
D50: setarray @c[2],154,49,148,261,132,189,100,192; | |
Disp("Entrance:Turtle Dungeon 1:Turtle Dungeon 2:Turtle Dungeon 3"); Pick("tur_dun"); | |
D51: Restrict("Pre-RE",1,2); | |
setarray @c[2],42,31,48,30,204,78; | |
Disp("Carpenter's Shop in the Tree:Passage to a Foreign World:Hvergermil's Fountain"); | |
Pick("","um_dun01","um_dun02","yggdrasil01"); | |
D52: Restrict("RE"); | |
setarray @c[2],275,21,15,115,15,115,159,27,162,36,159,11,156,33,337,333,314,64,163,18,156,20,39,81; | |
Disp("Sewage Treatment Plant:1st Power Plant:2nd Power Plant:Large Bath Meditathio:Lost Farm Valley:Library Memory Corridor:Upper Floor of Tartaros Storage:Lower Floor of Tartaros Storage:Death Rune:Fire Rune:Grass Rune:Ice Rune"); Pick("","ba_pw02","ba_pw01","ba_pw03","ba_bath","ba_lost","ba_lib","ba_2whs01","ba_2whs02","bl_death","bl_lava","bl_grass","bl_ice"); | |
D53: Restrict("RE"); | |
setarray @c[2],244,61,72,20,122,22; | |
Disp("Lab-OPTATIO:R&D-WISH:Verus Center Square"); Pick("verus"); | |
'''; | |
/// -------------------------------------------------- | |
/// Castles: | |
/// -------------------------------------------------- | |
const $castles = ''' | |
C1: setarray @c[2],48,83,95,249,142,85,239,242,264,90; | |
Disp("Neuschwanstein:Hohenschwangau:Nuenberg:Wuerzburg:Rothenburg"); | |
Pick("","alde_gld","alde_gld","alde_gld","alde_gld","alde_gld"); | |
C2: setarray @c[2],214,75,308,240,143,240,193,278,305,87; | |
Disp("Repherion:Eeyolbriggar:Yesnelph:Bergel:Mersetzdeitz"); | |
Pick("","gef_fild13","gef_fild13","gef_fild13","gef_fild13","gef_fild13"); | |
C3: setarray @c[2],121,233,295,116,317,293,140,160,204,266; | |
Disp("Bright Arbor:Scarlet Palace:Holy Shadow:Sacred Altar:Bamboo Grove Hill"); | |
Pick("","pay_gld","pay_gld","pay_gld","pay_gld","pay_gld"); | |
C4: setarray @c[2],134,65,240,128,153,137,111,240,208,240; | |
Disp("Kriemhild:Swanhild:Fadhgridh:Skoegul:Gondul"); | |
Pick("","prt_gld","prt_gld","prt_gld","prt_gld","prt_gld"); | |
C5: setarray @c[2],158,272,83,47,68,155,299,345,292,107; | |
Disp("Mardol:Cyr:Horn:Gefn:Banadis"); | |
Pick("","aru_gld","aru_gld","aru_gld","aru_gld","aru_gld"); | |
C6: setarray @c[2],293,100,288,252,97,196,137,90,71,315; | |
Disp("Himinn:Andlangr:Viblainn:Hljod:Skidbladnir"); | |
Pick("","sch_gld","sch_gld","sch_gld","sch_gld","sch_gld"); | |
C7: Restrict("RE"); | |
setarray @c[2],48,83,95,249,142,85,239,242,264,90; | |
Disp("Kafragarten 1:Kafragarten 2:Kafragarten 3:Kafragarten 4:Kafragarten 5"); | |
Pick("","te_alde_gld","te_alde_gld","te_alde_gld","te_alde_gld","te_alde_gld"); | |
C8: Restrict("RE"); | |
setarray @c[2],134,65,240,128,153,137,111,240,208,240; | |
Disp("Gloria 1:Gloria 2:Gloria 3:Gloria 4:Gloria 5"); | |
Pick("","te_prt_gld","te_prt_gld","te_prt_gld","te_prt_gld","te_prt_gld"); | |
'''; | |
/// -------------------------------------------------- | |
/// Guild Dungeons: | |
/// -------------------------------------------------- | |
const $guildDungeons = ''' | |
G1: Restrict("RE",2,3); | |
setarray @c[2],119,93,119,93,120,130; | |
Disp("Baldur F1:Baldur F2:Hall of Abyss"); | |
Pick("","gld_dun01","gld_dun01_2","gld2_pay"); | |
G2: Restrict("RE",2,3); | |
setarray @c[2],39,161,39,161,147,155; | |
Disp("Luina F1:Luina F2:Hall of Abyss"); | |
Pick("","gld_dun02","gld_dun02_2","gld2_ald"); | |
G3: Restrict("RE",2,3); | |
setarray @c[2],50,44,50,44,140,132; | |
Disp("Valkyrie F1:Valkyrie F2:Hall of Abyss"); | |
Pick("","gld_dun03","gld_dun03_2","gld2_prt"); | |
G4: Restrict("RE",2,3); | |
setarray @c[2],116,45,116,45,152,118; | |
Disp("Britoniah F1:Britoniah F2:Hall of Abyss"); | |
Pick("","gld_dun04","gld_dun04_2","gld2_gef"); | |
G5: Go("arug_dun01",199,195); | |
G6: Go("schg_dun01",200,124); | |
G7: Restrict("RE"); | |
Go("teg_dun01",42,36); | |
G8: Restrict("RE"); | |
Go("teg_dun02",26,160); | |
'''; | |
/// -------------------------------------------------- | |
/// Instances: | |
/// -------------------------------------------------- | |
const $instances = ''' | |
G1: Restrict("RE",2,3); | |
setarray @c[2],119,93,119,93,120,130; | |
Disp("Baldur F1:Baldur F2:Hall of Abyss"); | |
Pick("","gld_dun01","gld_dun01_2","gld2_pay"); | |
G2: Restrict("RE",2,3); | |
setarray @c[2],39,161,39,161,147,155; | |
Disp("Luina F1:Luina F2:Hall of Abyss"); | |
Pick("","gld_dun02","gld_dun02_2","gld2_ald"); | |
G3: Restrict("RE",2,3); | |
setarray @c[2],50,44,50,44,140,132; | |
Disp("Valkyrie F1:Valkyrie F2:Hall of Abyss"); | |
Pick("","gld_dun03","gld_dun03_2","gld2_prt"); | |
G4: Restrict("RE",2,3); | |
setarray @c[2],116,45,116,45,152,118; | |
Disp("Britoniah F1:Britoniah F2:Hall of Abyss"); | |
Pick("","gld_dun04","gld_dun04_2","gld2_gef"); | |
G5: Go("arug_dun01",199,195); | |
G6: Go("schg_dun01",200,124); | |
G7: Restrict("RE"); | |
Go("teg_dun01",42,36); | |
G8: Restrict("RE"); | |
Go("teg_dun02",26,160); | |
'''; | |
/// -------------------------------------------------- | |
/// Special: | |
/// -------------------------------------------------- | |
const $special = ''' | |
S1: Go("auction_01",22,68); | |
S2: Go("bat_room",154,150); | |
S3: Go("cmd_in02",179,129); | |
S4: Restrict("RE"); | |
Go("dali",113,82); | |
S5: Restrict("RE"); | |
Go("moc_para01",31,14); | |
S6: Go("gon_test",48,10); | |
S7: Go("arena_room",100,88); | |
S8: Go("p_track01",62,41); | |
S9: Restrict("RE"); | |
Go("paramk",97,17); | |
S10: Go("turbo_room",99,114); | |
'''; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment