Skip to content

Instantly share code, notes, and snippets.

@PlugFox
Last active April 26, 2024 18:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PlugFox/31069d30374670557a023c557793f121 to your computer and use it in GitHub Desktop.
Save PlugFox/31069d30374670557a023c557793f121 to your computer and use it in GitHub Desktop.
rAthena Warper to OpenKore portals.txt
/*
* 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