// TMW2 Scripts // Author: // Jesusalva // Description: // Controls map domain 030 and provide helpers. See constants; // Player Variables: // MAZE_ID → ID of the maze being used // MAZE_MAP$ → Map being used for the maze // MAZE_INST → Instance ID of the Maze ///////////////////////////////////////////////////////////////////////////////// // CreateMaze(scope=IOT_CHAR{, size=MAZE_SIZE_S}) // Creates the maze instances so they can be configured // But does not initializes anything. function script CreateMaze { .@scope = getarg(0, IOT_CHAR); .@size = getarg(1, MAZE_SIZE_S); // Small mazes (30x30 average) (24 total) if (.@size & MAZE_SIZE_S) { .@p = getarraysize(.@ids); setarray .@ids[.@p], 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24; } // Medium mazes (45x45 average) (15 total) if (.@size & MAZE_SIZE_M) { .@p = getarraysize(.@ids); setarray .@ids[.@p], 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39; } // Great mazes (60x60 average) (20 total) if (.@size & MAZE_SIZE_G) { .@p = getarraysize(.@ids); setarray .@ids[.@p], 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59; } // Xtra mazes (75x75 average) (10 total) if (.@size & MAZE_SIZE_X) { .@p = getarraysize(.@ids); setarray .@ids[.@p], 60, 61, 62, 63, 64, 65, 66, 67, 68, 69; } // Abs. mazes (90x90 average) (6 total) if (.@size & MAZE_SIZE_A) { .@p = getarraysize(.@ids); setarray .@ids[.@p], 70, 71, 72, 73, 74, 75; } // Get a random maze, but it must not be repeated do { .@r = any_of(.@ids); if (MAZE_ID == .@r) continue; MAZE_ID = .@r; .@MAZEMP$=sprintf("030-%02d", MAZE_ID); MAZE_MAP$=sprintf("mz%02d@"+getcharid(0), MAZE_ID); // Maze is not yet started if (.@scope == IOT_CHAR) { MAZE_INST = instance_create("Maze "+MAZE_ID+" "+getcharid(0), getcharid(3), IOT_CHAR); // Failed if (MAZE_INST < 0) { consolebug("Instance \"%s\" already exists! (Error %d)", "Maze "+MAZE_ID+" "+getcharid(0), MAZE_INST); continue; // Get a new maze } // Attach map instance_attachmap(.@MAZEMP$, MAZE_INST, false, MAZE_MAP$); } else { consolebug("Scope %d not yet supported by maze system", .@scope); return 0; // Exit early } } while (MAZE_INST < 0); return MAZE_ID; } ///////////////////////////////////////////////////////////////////////////////// // InitMaze(duration=2 hours, random=yes) // Puts maze to work and send player there. // Exit must have been configured prior to the maze. function script InitMaze { .@t = getarg(0, 7200); instance_set_timeout(.@t, .@t, MAZE_INST); instance_init(MAZE_INST); // Find random, warpable coordinates .@e=0; .@x=0; .@y=0; if (getarg(1, true)) { .@mx=getmapinfo(MAPINFO_SIZE_X, MAZE_MAP$)-20; .@my=getmapinfo(MAPINFO_SIZE_Y, MAZE_MAP$)-20; } else { .@mx=40; // Wouldn't (30,30) be safer? .@my=40; } do { .@x = rand2(20, .@mx); .@y = rand2(20, .@my); .@e += 1; if (.@e > 30) { consolebug("Too many failures at Maze \"%s\"! Trying anyway!", MAZE_MAP$); break; } } while (!checknpccell(MAZE_MAP$, .@x, .@y, cell_chkpass)); warp MAZE_MAP$, .@x, .@y; return true; } ///////////////////////////////////////////////////////////////////////////////// // RenewMaze(duration=2 hours) // Renews the map expiration time function script RenewMaze { .@t = getarg(0, 7200); instance_set_timeout(.@t, .@t, MAZE_INST); return true; } ///////////////////////////////////////////////////////////////////////////////// // Configure maze maps as MMO zones 030-01 mapflag zone MMO 030-02 mapflag zone MMO 030-03 mapflag zone MMO 030-04 mapflag zone MMO 030-05 mapflag zone MMO 030-06 mapflag zone MMO 030-07 mapflag zone MMO 030-08 mapflag zone MMO 030-09 mapflag zone MMO 030-10 mapflag zone MMO 030-11 mapflag zone MMO 030-12 mapflag zone MMO 030-13 mapflag zone MMO 030-14 mapflag zone MMO 030-15 mapflag zone MMO 030-16 mapflag zone MMO 030-17 mapflag zone MMO 030-18 mapflag zone MMO 030-19 mapflag zone MMO 030-20 mapflag zone MMO 030-21 mapflag zone MMO 030-22 mapflag zone MMO 030-23 mapflag zone MMO 030-24 mapflag zone MMO 030-25 mapflag zone MMO 030-26 mapflag zone MMO 030-27 mapflag zone MMO 030-28 mapflag zone MMO 030-29 mapflag zone MMO 030-30 mapflag zone MMO 030-31 mapflag zone MMO 030-32 mapflag zone MMO 030-33 mapflag zone MMO 030-34 mapflag zone MMO 030-35 mapflag zone MMO 030-36 mapflag zone MMO 030-37 mapflag zone MMO 030-38 mapflag zone MMO 030-39 mapflag zone MMO 030-40 mapflag zone MMO 030-41 mapflag zone MMO 030-42 mapflag zone MMO 030-43 mapflag zone MMO 030-44 mapflag zone MMO 030-45 mapflag zone MMO 030-46 mapflag zone MMO 030-47 mapflag zone MMO 030-48 mapflag zone MMO 030-49 mapflag zone MMO 030-50 mapflag zone MMO 030-51 mapflag zone MMO 030-52 mapflag zone MMO 030-53 mapflag zone MMO 030-54 mapflag zone MMO 030-55 mapflag zone MMO 030-56 mapflag zone MMO 030-57 mapflag zone MMO 030-58 mapflag zone MMO 030-59 mapflag zone MMO 030-60 mapflag zone MMO 030-61 mapflag zone MMO 030-62 mapflag zone MMO 030-63 mapflag zone MMO 030-64 mapflag zone MMO 030-65 mapflag zone MMO 030-66 mapflag zone MMO 030-67 mapflag zone MMO 030-68 mapflag zone MMO 030-69 mapflag zone MMO 030-70 mapflag zone MMO 030-71 mapflag zone MMO 030-72 mapflag zone MMO 030-73 mapflag zone MMO 030-74 mapflag zone MMO 030-75 mapflag zone MMO