├── client ├── DATA.INI ├── .htaccess └── lua files │ ├── datainfo │ ├── accname.lua │ └── jobname.lua │ ├── spreditinfo │ ├── 2dlayerdir_f.lua │ ├── smalllayerdir_male.lua │ └── smalllayerdir_female.lua │ └── skillinfoz │ └── jobinheritlist.lua ├── core ├── .htaccess ├── class.Debug.php ├── class.Cache.php ├── class.Controller.php ├── class.Client.php └── class.DB.php ├── db ├── .htaccess ├── body.php ├── hats.php ├── pals.php ├── pets.php ├── robe.php ├── shield.php ├── weapon.php ├── hair.php ├── inherit.robe.php ├── shadow.php ├── small_M.robe.php └── small_F.robe.php ├── cache ├── .htaccess ├── avatar │ └── data │ │ ├── border.png │ │ ├── background01.jpg │ │ └── background02.jpg └── signature │ └── data │ └── background01.jpg ├── loaders ├── .htaccess ├── class.Grf.php ├── Bmp.php ├── class.Sprite.php └── class.Action.php ├── render ├── .htaccess ├── class.CharacterRender.php ├── class.MonsterRender.php ├── class.CharacterHeadRender.php └── class.RORender.php ├── controllers ├── .htaccess ├── monster.php ├── generator.php ├── characterhead.php ├── character.php ├── avatar.php ├── signature.php └── update.php ├── .htaccess ├── .gitattributes ├── index.php ├── .gitignore └── README.md /client/DATA.INI: -------------------------------------------------------------------------------- 1 | [Data] 2 | 0=sdata.grf -------------------------------------------------------------------------------- /core/.htaccess: -------------------------------------------------------------------------------- 1 | Order allow,deny 2 | Deny from All -------------------------------------------------------------------------------- /db/.htaccess: -------------------------------------------------------------------------------- 1 | Order allow,deny 2 | Deny from All -------------------------------------------------------------------------------- /cache/.htaccess: -------------------------------------------------------------------------------- 1 | Order allow,deny 2 | Deny from All -------------------------------------------------------------------------------- /client/.htaccess: -------------------------------------------------------------------------------- 1 | Order allow,deny 2 | Deny from All -------------------------------------------------------------------------------- /loaders/.htaccess: -------------------------------------------------------------------------------- 1 | Order allow,deny 2 | Deny from All -------------------------------------------------------------------------------- /render/.htaccess: -------------------------------------------------------------------------------- 1 | Order allow,deny 2 | Deny from All -------------------------------------------------------------------------------- /controllers/.htaccess: -------------------------------------------------------------------------------- 1 | Order allow,deny 2 | Deny from All -------------------------------------------------------------------------------- /db/body.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/db/body.php -------------------------------------------------------------------------------- /db/hats.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/db/hats.php -------------------------------------------------------------------------------- /db/pals.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/db/pals.php -------------------------------------------------------------------------------- /db/pets.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/db/pets.php -------------------------------------------------------------------------------- /db/robe.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/db/robe.php -------------------------------------------------------------------------------- /db/shield.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/db/shield.php -------------------------------------------------------------------------------- /db/weapon.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/db/weapon.php -------------------------------------------------------------------------------- /cache/avatar/data/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/cache/avatar/data/border.png -------------------------------------------------------------------------------- /render/class.CharacterRender.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/render/class.CharacterRender.php -------------------------------------------------------------------------------- /cache/avatar/data/background01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/cache/avatar/data/background01.jpg -------------------------------------------------------------------------------- /cache/avatar/data/background02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/cache/avatar/data/background02.jpg -------------------------------------------------------------------------------- /cache/signature/data/background01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/cache/signature/data/background01.jpg -------------------------------------------------------------------------------- /client/lua files/datainfo/accname.lua: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/client/lua files/datainfo/accname.lua -------------------------------------------------------------------------------- /client/lua files/datainfo/jobname.lua: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScDarko/ROChargenPHP/HEAD/client/lua files/datainfo/jobname.lua -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | Options -Indexes 2 | Options +FollowSymlinks 3 | 4 | 5 | RewriteEngine On 6 | 7 | RewriteCond %{REQUEST_FILENAME} !-f 8 | RewriteCond %{REQUEST_FILENAME} !-d 9 | RewriteRule ^(.*)$ index.php?/$1 [L] 10 | -------------------------------------------------------------------------------- /db/hair.php: -------------------------------------------------------------------------------- 1 | array( 1,1,4,7,1,5,3,6,12,10,9,11,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27), 11 | "M" => array( 1,1,1,7,5,4,3,6,8,9,10,12,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27) 12 | ); 13 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /controllers/monster.php: -------------------------------------------------------------------------------- 1 | render($mobid); 48 | Cache::save(); 49 | } 50 | 51 | 52 | /** 53 | * Render avatar 54 | */ 55 | private function render($mobid) 56 | { 57 | // What you want 58 | $gen = new MonsterRender(); 59 | $gen->action = MonsterRender::ACTION_IDLE; // See constantes in 60 | $gen->direction = MonsterRender::DIRECTION_SOUTHEAST; // class.RORender.php 61 | $gen->body_animation = 0; 62 | $gen->class = $mobid; 63 | //$gen->accessory = 10013; // Pet accessory 64 | 65 | // Generate image 66 | $img = $gen->render(); 67 | 68 | // Display image 69 | imagepng( $img ); 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /core/class.Debug.php: -------------------------------------------------------------------------------- 1 | '. $message . ''; 21 | } 22 | 23 | /** 24 | * Enable 25 | */ 26 | static public function enable() 27 | { 28 | self::$actived = true; 29 | 30 | } 31 | 32 | /** 33 | * Disable debug mode 34 | */ 35 | static public function disable() 36 | { 37 | self::$actived = false; 38 | } 39 | 40 | /** 41 | * Is in debug mode ? 42 | */ 43 | static public function isEnable() 44 | { 45 | return self::$actived; 46 | } 47 | 48 | /** 49 | * Output the log 50 | */ 51 | static public function output() { 52 | if( self::$actived ) { 53 | $img = ob_get_contents(); 54 | ob_end_clean(); 55 | 56 | header('Content-type:text/html'); 57 | 58 | echo ''; 64 | 65 | echo '

Trace output

'; 66 | echo implode('', self::$messages); 67 | 68 | if( !empty($img) ) { 69 | echo '

Result

'; 70 | echo 'not able to render...'; 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /render/class.MonsterRender.php: -------------------------------------------------------------------------------- 1 | 0, 35 | "accessory" => 0 // pets accessory 36 | ); 37 | 38 | 39 | /** 40 | * Public access 41 | */ 42 | public $body_animation = 0; 43 | 44 | 45 | /** 46 | * Render, return an image 47 | */ 48 | public function render() 49 | { 50 | // Initialised the image 51 | $img = $this->createImage(); 52 | $view = $this->param; 53 | 54 | // Draw shadow 55 | $this->renderImage( $img, array( 56 | "path" => "data/sprite/shadow", 57 | "scale" => DB::get_shadow_factor($view['class']) 58 | )); 59 | 60 | // Draw unit 61 | $spr = DB::get_entity_path($view['class']); 62 | $act = ( !empty($view['accessory']) ) ? DB::get_pet_accessory( $view['accessory'] ) : $spr . '.act'; 63 | 64 | $this->renderImage( $img, array( 65 | "spr" => $spr . '.spr', 66 | "act" => $act 67 | )); 68 | 69 | // Return resulted image 70 | return $img; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /core/class.Cache.php: -------------------------------------------------------------------------------- 1 | time() ) { 27 | $content = file_get_contents($path); 28 | return true; 29 | } 30 | 31 | unlink($path); 32 | } 33 | 34 | return false; 35 | } 36 | 37 | 38 | /** 39 | * Set a directory where to save files 40 | */ 41 | static public function setNamespace($name) 42 | { 43 | self::$directory = $name; 44 | } 45 | 46 | 47 | /** 48 | * Set a filename 49 | */ 50 | static public function setFilename($name) 51 | { 52 | self::$filename = $name; 53 | } 54 | 55 | 56 | /** 57 | * Store a file in cache 58 | */ 59 | static public function save() 60 | { 61 | // Cache not disable 62 | if( self::$time > 0 ) { 63 | $path = self::$directory . DIRECTORY_SEPARATOR . self::$filename; 64 | $current_path = self::$path; 65 | $directories = explode('/', $path); 66 | array_pop($directories); // remove filename 67 | 68 | // Creating directories 69 | foreach( $directories as $dir ) { 70 | $current_path .= $dir . DIRECTORY_SEPARATOR; 71 | if( !file_exists($current_path) ) { 72 | mkdir( $current_path ); 73 | } 74 | } 75 | 76 | // Saving content 77 | file_put_contents( self::$path . $path, ob_get_contents() ); 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /controllers/generator.php: -------------------------------------------------------------------------------- 1 | false). 32 | $chargen = new CharacterRender(); 33 | $chargen->action = intval($action); 34 | $chargen->direction = intval($direction); 35 | $chargen->body_animation = intval($animation); 36 | 37 | $chargen->sex = $sex; 38 | $chargen->class = intval($jobid); 39 | $chargen->clothes_color = intval($clothes_color); 40 | 41 | $chargen->hair = intval($hair); 42 | $chargen->hair_color = intval($hair_color); 43 | $chargen->doridori = intval($doridori); 44 | 45 | $chargen->head_top = intval($head_top); 46 | $chargen->head_mid = intval($head_mid); 47 | $chargen->head_bottom = intval($head_bottom); 48 | 49 | $chargen->weapon = intval($weapon); 50 | $chargen->shield = intval($shield); 51 | $chargen->robe = intval($robe); 52 | 53 | $chargen->option = intval($option); 54 | 55 | // Generate Image 56 | $img = $chargen->render(); 57 | 58 | imagepng($img); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /render/class.CharacterHeadRender.php: -------------------------------------------------------------------------------- 1 | "M", 24 | "hair" => 2 , 25 | "hair_color" => 0 , 26 | "head_top" => 0 , 27 | "head_mid" => 0 , 28 | "head_bottom" => 0 , 29 | ); 30 | 31 | 32 | /** 33 | * Image setting 34 | */ 35 | public $image_size = array( 80, 80 ); 36 | public $dot_reference = array( 40, 120 ); 37 | public $doridori = 0; 38 | 39 | 40 | /** 41 | * Bind parameter with some SQL datas 42 | */ 43 | public function loadFromSqlData($args) 44 | { 45 | foreach( $this->param as $type => &$view ) 46 | { 47 | if ( isset($args[$type]) ) 48 | $view = $args[$type]; 49 | } 50 | } 51 | 52 | 53 | /** 54 | * Render, return an image 55 | */ 56 | public function render() 57 | { 58 | // Initialised the image 59 | $img = $this->createImage(); 60 | $view = $this->param; 61 | 62 | // Draw head 63 | $this->renderImage( $img, array( 64 | "path" => DB::get_head_path( $view['hair'], $view['sex'] ), 65 | "pal" => DB::get_head_pal_path( $view['hair'], $view['sex'], $view['hair_color'] ) 66 | )); 67 | 68 | // Draw head top 69 | if ( !empty($view['head_top']) ) 70 | $this->renderImage( $img, array( 71 | "path" => DB::get_hat_path( $view['head_top'], $view['sex'] ) 72 | )); 73 | 74 | // Draw head mid 75 | if ( !empty($view['head_mid']) && $view['head_mid'] !== $view['head_top'] ) // Don't render the same sprite twice 76 | $this->renderImage( $img, array( 77 | "path" => DB::get_hat_path( $view['head_mid'], $view['sex'] ) 78 | )); 79 | 80 | // Draw head bot 81 | if ( !empty($view['head_bottom']) && $view['head_bottom'] !== $view['head_mid'] ) // Don't render the same sprite twice 82 | $this->renderImage( $img, array( 83 | "path" => DB::get_hat_path( $view['head_bottom'], $view['sex'] ) 84 | )); 85 | 86 | // Return resulted image 87 | return $img; 88 | } 89 | } 90 | 91 | -------------------------------------------------------------------------------- /core/class.Controller.php: -------------------------------------------------------------------------------- 1 | $controller ) { 44 | 45 | if( preg_match("/^" . str_replace("/", "\/", $path) . "$/", $query, $matches) ) { 46 | 47 | $fileName = __ROOT__ . "controllers/" . strtolower($controller) . ".php"; 48 | $className = $controller . "_Controller"; 49 | 50 | if( file_exists($fileName) ) { 51 | 52 | Debug::write('Running controller "'. $controller .'".', 'info'); 53 | 54 | require_once($fileName); 55 | call_user_func_array( 56 | array( new $className, "process"), 57 | array_slice( $matches, 1) 58 | ); 59 | 60 | return true; 61 | } 62 | } 63 | } 64 | 65 | Debug::write('Route not found.', 'error'); 66 | return false; 67 | } 68 | 69 | 70 | /** 71 | * Initialize database 72 | */ 73 | public function loadDatabase() 74 | { 75 | Debug::write('Connecting to DB....', 'title'); 76 | 77 | try { 78 | $this->db = new PDO( 79 | "mysql:host=". self::$hostname .";dbname=". self::$database, 80 | self::$username, self::$password 81 | ); 82 | } catch (PDOException $e) { 83 | Debug::write('Connection to DB fail.' . $e->getMessage(), 'error'); 84 | return; 85 | } 86 | 87 | Debug::write('Connection success.', 'success'); 88 | } 89 | 90 | 91 | /** 92 | * SQL Query helper 93 | */ 94 | public function query($query, $args=array()) { 95 | $req = $this->db->prepare($query); 96 | $req->execute($args); 97 | return $req->fetchAll(); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /db/inherit.robe.php: -------------------------------------------------------------------------------- 1 | 0, 12 | 4002 => 1, 13 | 4003 => 2, 14 | 4006 => 5, 15 | 4004 => 3, 16 | 4005 => 4, 17 | 4007 => 6, 18 | 4190 => 23, 19 | 4023 => 0, 20 | 4024 => 1, 21 | 4025 => 2, 22 | 4026 => 3, 23 | 4027 => 4, 24 | 4028 => 5, 25 | 4029 => 6, 26 | 4030 => 7, 27 | 4031 => 8, 28 | 4032 => 9, 29 | 4033 => 10, 30 | 4034 => 11, 31 | 4035 => 12, 32 | 4037 => 14, 33 | 4038 => 15, 34 | 4039 => 16, 35 | 4040 => 17, 36 | 4041 => 18, 37 | 4042 => 19, 38 | 4043 => 20, 39 | 4045 => 23, 40 | 4096 => 4054, 41 | 4097 => 4055, 42 | 4098 => 4056, 43 | 4099 => 4057, 44 | 4100 => 4058, 45 | 4101 => 4059, 46 | 4102 => 4066, 47 | 4103 => 4067, 48 | 4104 => 4068, 49 | 4105 => 4069, 50 | 4106 => 4070, 51 | 4107 => 4071, 52 | 4108 => 4072, 53 | 4191 => 4190, 54 | 4059 => 12, 55 | 4019 => 18, 56 | 4071 => 18, 57 | 4021 => 20, 58 | 4069 => 20, 59 | 4020 => 19, 60 | 4068 => 19, 61 | 4016 => 15, 62 | 4070 => 15, 63 | 4018 => 17, 64 | 4072 => 17, 65 | 4008 => 7, 66 | 4057 => 8, 67 | 4115 => 4116, 68 | 4015 => 14, 69 | 4058 => 10, 70 | 4010 => 9, 71 | 4055 => 9, 72 | 4118 => 4119, 73 | 4120 => 4119, 74 | 4121 => 4119, 75 | 4137 => 4119, 76 | 4138 => 4119, 77 | 4163 => 4119, 78 | 4180 => 4119, 79 | 4169 => 4119, 80 | 4188 => 4119, 81 | 4196 => 4119, 82 | 4126 => 4125, 83 | 4127 => 4125, 84 | 4129 => 4125, 85 | 4139 => 4125, 86 | 4156 => 4125, 87 | 4157 => 4125, 88 | 4162 => 4125, 89 | 4166 => 4125, 90 | 4174 => 4125, 91 | 4179 => 4125, 92 | 4187 => 4125, 93 | 4194 => 4125, 94 | 4140 => 4141, 95 | 4142 => 4141, 96 | 4143 => 4141, 97 | 4144 => 4141, 98 | 4145 => 4141, 99 | 4146 => 4141, 100 | 4165 => 4141, 101 | 4168 => 4141, 102 | 4175 => 4141, 103 | 4182 => 4141, 104 | 4189 => 4141, 105 | 4181 => 4141, 106 | 4147 => 4122, 107 | 4148 => 4122, 108 | 4149 => 4122, 109 | 4150 => 4122, 110 | 4151 => 4122, 111 | 4152 => 4122, 112 | 4153 => 4122, 113 | 4154 => 4122, 114 | 4161 => 4122, 115 | 4164 => 4122, 116 | 4170 => 4122, 117 | 4171 => 4122, 118 | 4177 => 4122, 119 | 4178 => 4122, 120 | 4186 => 4122, 121 | 4131 => 4130, 122 | 4132 => 4130, 123 | 4133 => 4130, 124 | 4134 => 4130, 125 | 4136 => 4130, 126 | 4160 => 4130, 127 | 4167 => 4130, 128 | 4173 => 4130, 129 | 7176 => 4130, 130 | 4185 => 4130, 131 | 4195 => 4130, 132 | 4123 => 4124, 133 | 4128 => 4124, 134 | 4155 => 4124, 135 | 4158 => 4124, 136 | 4172 => 4124, 137 | 4183 => 4124, 138 | 4192 => 4124, 139 | 4193 => 4124, 140 | 4213 => 4114, 141 | 4214 => 4114, 142 | 143 | ); -------------------------------------------------------------------------------- /controllers/characterhead.php: -------------------------------------------------------------------------------- 1 | getPlayerData($pseudo); 49 | $this->render($data); 50 | 51 | // Cache 52 | Cache::save(); 53 | } 54 | 55 | 56 | /** 57 | * Get player data from SQL 58 | */ 59 | private function getPlayerData($pseudo) 60 | { 61 | $data = $this->query(" 62 | SELECT 63 | char.hair, char.hair_color, 64 | char.head_top, char.head_mid, char.head_bottom, 65 | login.sex 66 | FROM `char` 67 | LEFT JOIN `login` ON login.account_id = char.account_id 68 | WHERE char.name = ? 69 | LIMIT 1", 70 | array($pseudo) 71 | ); 72 | 73 | // No character found ? Load a default character ? 74 | if( empty($data) ) { 75 | 76 | // Store file, not needed to recalculate it each time 77 | Cache::setFilename("[notfound].png"); 78 | $content = ""; 79 | 80 | if( Cache::get($content) ) { 81 | die($content); 82 | } 83 | 84 | return array( 85 | "class" => 0, 86 | "clothes_color" => 0, 87 | "hair" => 2, 88 | "hair_color" => 0, 89 | "head_top" => 0, 90 | "head_mid" => 0, 91 | "head_bottom" => 0, 92 | "robe" => 0, 93 | "weapon" => 0, 94 | "shield" => 0, 95 | "sex" => "M" 96 | ); 97 | } 98 | 99 | return $data[0]; 100 | } 101 | 102 | 103 | /** 104 | * Render avatar 105 | */ 106 | private function render($data) 107 | { 108 | // Load Sprites and set parameters 109 | $chargen = new CharacterHeadRender(); 110 | $chargen->direction = CharacterHeadRender::DIRECTION_SOUTH; 111 | $chargen->doridori = 2; 112 | 113 | // Generate Image 114 | $chargen->loadFromSqlData($data); 115 | $img = $chargen->render(); 116 | 117 | imagepng($img); 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /controllers/character.php: -------------------------------------------------------------------------------- 1 | getPlayerData($pseudo); 50 | $this->render($data, $action, $animation); 51 | 52 | // Cache 53 | Cache::save(); 54 | } 55 | 56 | 57 | /** 58 | * Get player data from SQL 59 | */ 60 | private function getPlayerData($pseudo) 61 | { 62 | $data = $this->query(" 63 | SELECT 64 | char.class, char.clothes_color, 65 | char.hair, char.hair_color, 66 | char.head_top, char.head_mid, char.head_bottom, 67 | char.robe, char.weapon, char.shield, 68 | char.option, 69 | login.sex 70 | FROM `char` 71 | LEFT JOIN `login` ON login.account_id = char.account_id 72 | WHERE char.name = ? 73 | LIMIT 1", 74 | array($pseudo) 75 | ); 76 | 77 | // No character found ? Load a default character ? 78 | if( empty($data) ) { 79 | 80 | // Store file, not needed to recalculate it each time 81 | Cache::setFilename("[notfound].png"); 82 | $content = ""; 83 | 84 | if( Cache::get($content) ) { 85 | die($content); 86 | } 87 | 88 | return array( 89 | "class" => 0, 90 | "clothes_color" => 0, 91 | "hair" => 2, 92 | "hair_color" => 0, 93 | "head_top" => 0, 94 | "head_mid" => 0, 95 | "head_bottom" => 0, 96 | "robe" => 0, 97 | "weapon" => 0, 98 | "shield" => 0, 99 | "sex" => "M" 100 | ); 101 | } 102 | 103 | return $data[0]; 104 | } 105 | 106 | 107 | /** 108 | * Render avatar 109 | */ 110 | private function render($data, $action, $animation) 111 | { 112 | // Load Class and set parameters 113 | $chargen = new CharacterRender(); 114 | $chargen->action = $action == -1 ? CharacterRender::ACTION_READYFIGHT : intval($action); 115 | $chargen->direction = $animation == -1 ? CharacterRender::DIRECTION_SOUTHEAST : intval($animation); 116 | $chargen->body_animation = 4; 117 | $chargen->doridori = 0; 118 | 119 | // Generate Image 120 | $chargen->loadFromSqlData($data); 121 | $img = $chargen->render(); 122 | 123 | imagepng($img); 124 | } 125 | 126 | } 127 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | getMessage(), 'error'); 97 | } 98 | 99 | 100 | // Debug 101 | Debug::output(); -------------------------------------------------------------------------------- /loaders/class.Grf.php: -------------------------------------------------------------------------------- 1 | open($filename); 28 | } 29 | 30 | 31 | /** 32 | * Clean up memory 33 | */ 34 | public function __destruct() 35 | { 36 | if( $this->fp && is_resource($this->fp) ) { 37 | fclose($this->fp); 38 | } 39 | } 40 | 41 | 42 | /** 43 | * Open a file 44 | */ 45 | public function open($filename) 46 | { 47 | if( !file_exists($filename) || !is_readable($filename) ) 48 | throw new Exception("GRF::load() - Can't open '{$filename}'."); 49 | 50 | if( filesize($filename) < self::HEADER_SIZE ) 51 | throw new Exception("GRF::load() - Not enough data to contain a valid header."); 52 | 53 | // Open it 54 | $this->fp = fopen( $filename, 'r' ); 55 | } 56 | 57 | 58 | /** 59 | * Load the GRF 60 | */ 61 | public function load() 62 | { 63 | if( empty($this->fp) ) 64 | throw new Exception("GRF::load() - No file specify."); 65 | 66 | // Parse header. 67 | $this->header = unpack("a15signature/a15key/Ltable_offset/Lseeds/Lfilecount/Lversion", fread($this->fp, self::HEADER_SIZE) ); 68 | 69 | if ( $this->header['signature'] !== 'Master of Magic' || $this->header['version'] !== 0x200 ) 70 | throw new Exception("GRF::load() - Sorry, can just open 0x200 version."); 71 | 72 | // Load table list 73 | fseek( $this->fp, $this->header['table_offset'], SEEK_CUR); 74 | $fileTableInfo = unpack("Lpack_size/Lreal_size", fread($this->fp, 0x08)); 75 | $this->fileTable = @gzuncompress( fread( $this->fp, $fileTableInfo['pack_size'] ), $fileTableInfo['real_size'] ); 76 | 77 | // Extraction error 78 | if($this->fileTable === false ) 79 | throw new Exception("GRF::load() - Can't extract fileTable."); 80 | 81 | // Grf now loaded 82 | $this->loaded = true; 83 | } 84 | 85 | 86 | /** 87 | * Search a filename 88 | */ 89 | public function getFile($filename, &$content) 90 | { 91 | if( !$this->loaded ) 92 | return false; 93 | 94 | // Not case sensitive. 95 | $position = strpos( $this->fileTable, $filename . "\0" ); 96 | 97 | // File not found 98 | if( $position === false ) 99 | return false; 100 | 101 | // Extract file info from fileList 102 | $position += strlen($filename) + 1; 103 | $fileInfo = unpack('Lpack_size/Llength_aligned/Lreal_size/Cflags/Lposition', substr($this->fileTable, $position, 17) ); 104 | 105 | // Just open file. 106 | if( $fileInfo['flags'] !== 1 ) 107 | return false; 108 | 109 | // Extract file 110 | fseek( $this->fp, $fileInfo['position'] + self::HEADER_SIZE, SEEK_SET ); 111 | $content = gzuncompress( fread($this->fp, $fileInfo['pack_size']), $fileInfo['real_size'] ); 112 | 113 | return true; 114 | } 115 | 116 | 117 | /** 118 | * Filter 119 | * Find all occurences of a string in GRF list 120 | */ 121 | public function search( $regex ) { 122 | $list = array(); 123 | @preg_match_all( $regex, $this->fileTable, $matches ); 124 | 125 | if ( !empty($matches) ) { 126 | $list = $matches[0]; 127 | sort($list); 128 | } 129 | 130 | return $list; 131 | } 132 | } 133 | 134 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | 46 | [Dd]ebug/ 47 | [Rr]elease/ 48 | x64/ 49 | build/ 50 | [Bb]in/ 51 | [Oo]bj/ 52 | 53 | # MSTest test Results 54 | [Tt]est[Rr]esult*/ 55 | [Bb]uild[Ll]og.* 56 | 57 | *_i.c 58 | *_p.c 59 | *.ilk 60 | *.meta 61 | *.obj 62 | *.pch 63 | *.pdb 64 | *.pgc 65 | *.pgd 66 | *.rsp 67 | *.sbr 68 | *.tlb 69 | *.tli 70 | *.tlh 71 | *.tmp 72 | *.tmp_proj 73 | *.log 74 | *.vspscc 75 | *.vssscc 76 | .builds 77 | *.pidb 78 | *.log 79 | *.scc 80 | 81 | # Visual C++ cache files 82 | ipch/ 83 | *.aps 84 | *.ncb 85 | *.opensdf 86 | *.sdf 87 | *.cachefile 88 | 89 | # Visual Studio profiler 90 | *.psess 91 | *.vsp 92 | *.vspx 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | 101 | # TeamCity is a build add-in 102 | _TeamCity* 103 | 104 | # DotCover is a Code Coverage Tool 105 | *.dotCover 106 | 107 | # NCrunch 108 | *.ncrunch* 109 | .*crunch*.local.xml 110 | 111 | # Installshield output folder 112 | [Ee]xpress/ 113 | 114 | # DocProject is a documentation generator add-in 115 | DocProject/buildhelp/ 116 | DocProject/Help/*.HxT 117 | DocProject/Help/*.HxC 118 | DocProject/Help/*.hhc 119 | DocProject/Help/*.hhk 120 | DocProject/Help/*.hhp 121 | DocProject/Help/Html2 122 | DocProject/Help/html 123 | 124 | # Click-Once directory 125 | publish/ 126 | 127 | # Publish Web Output 128 | *.Publish.xml 129 | *.pubxml 130 | 131 | # NuGet Packages Directory 132 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 133 | #packages/ 134 | 135 | # Windows Azure Build Output 136 | csx 137 | *.build.csdef 138 | 139 | # Windows Store app package directory 140 | AppPackages/ 141 | 142 | # Others 143 | sql/ 144 | *.Cache 145 | ClientBin/ 146 | [Ss]tyle[Cc]op.* 147 | ~$* 148 | *~ 149 | *.dbmdl 150 | *.[Pp]ublish.xml 151 | *.pfx 152 | *.publishsettings 153 | 154 | # RIA/Silverlight projects 155 | Generated_Code/ 156 | 157 | # Backup & report files from converting an old project file to a newer 158 | # Visual Studio version. Backup files are not needed, because we have git ;-) 159 | _UpgradeReport_Files/ 160 | Backup*/ 161 | UpgradeLog*.XML 162 | UpgradeLog*.htm 163 | 164 | # SQL Server files 165 | App_Data/*.mdf 166 | App_Data/*.ldf 167 | 168 | ############# 169 | ## Windows detritus 170 | ############# 171 | 172 | # Windows image file caches 173 | Thumbs.db 174 | ehthumbs.db 175 | 176 | # Folder config file 177 | Desktop.ini 178 | 179 | # Recycle Bin used on file shares 180 | $RECYCLE.BIN/ 181 | 182 | # Mac crap 183 | .DS_Store 184 | 185 | 186 | ############# 187 | ## Python 188 | ############# 189 | 190 | *.py[co] 191 | 192 | # Packages 193 | *.egg 194 | *.egg-info 195 | dist/ 196 | build/ 197 | eggs/ 198 | parts/ 199 | var/ 200 | sdist/ 201 | develop-eggs/ 202 | .installed.cfg 203 | 204 | # Installer logs 205 | pip-log.txt 206 | 207 | # Unit test / coverage reports 208 | .coverage 209 | .tox 210 | 211 | #Translations 212 | *.mo 213 | 214 | #Mr Developer 215 | .mr.developer.cfg 216 | -------------------------------------------------------------------------------- /loaders/Bmp.php: -------------------------------------------------------------------------------- 1 | 0 && $bits < 16 ) { 32 | $palette = unpack('C'. $paletteSize, substr($data, 54, $paletteSize)); 33 | 34 | for( $i=1, $p=0; $i<$paletteSize; $i+=4 ) { 35 | $b = $palette[$i+0]; 36 | $g = $palette[$i+1]; 37 | $r = $palette[$i+2]; 38 | $a = $palette[$i+3]; 39 | 40 | // Magenta is transparent. 41 | if( ($r & 0xf8 === 0xf8) && ($g === 0) && ($b & 0xf8 === 0xf8) ) 42 | $a = 127; 43 | 44 | $imagePalette[$p++] = imagecolorallocatealpha($img, $r, $g, $b, $a); 45 | } 46 | } 47 | 48 | // Read ImageData 49 | $skip = ( 4 - ( (( ($bits * $width) + 7) >> 3 ) & 3 ) ) % 4; 50 | $size = $width * $height * ($bits >> 3) + $skip * $height; 51 | $imageData = unpack('C'. $size, substr($data, $offset, $size) ); 52 | 53 | 54 | switch( $bits ) { 55 | 56 | // Not an original DIB file ? 57 | default: return false; 58 | 59 | // 24 bits BMP 60 | case 24: 61 | for( $i=1, $y = $height-1; $y > -1; $y--, $i += $skip ) { 62 | for( $x=0; $x<$width; $x++, $i+=3 ) { 63 | $b = $imageData[$i+0]; 64 | $g = $imageData[$i+1]; 65 | $r = $imageData[$i+2]; 66 | 67 | if ( $r === 255 && $g === 0 && $b === 255) 68 | $c = imagecolorallocatealpha($img, $r, $g, $b, 127); 69 | else 70 | $c = imagecolorallocate($img, $r, $g, $b); 71 | 72 | imagesetpixel($img, $x, $y, $c ); 73 | } 74 | } 75 | break; 76 | 77 | 78 | // 8 bits BMP 79 | case 8: 80 | for( $i=1, $y = $height-1; $y > -1; $y--, $i += $skip ) { 81 | for( $x=0; $x<$width; $x++, $i++ ) { 82 | imagesetpixel($img, $x, $y, $imagePalette[$imageData[$i]] ); 83 | } 84 | } 85 | break; 86 | 87 | 88 | // 4 bits BMP 89 | case 4: 90 | for( $i=1, $y = $height-1; $y > -1; $y--, $i += $skip ) { 91 | for( $x=0; $x<$width; $x+=2, $i++ ) { 92 | $byte = &$imageData[$i]; 93 | imagesetpixel($img, $x+0, $y, $imagePalette[$byte >> 4 ]); 94 | imagesetpixel($img, $x+1, $y, $imagePalette[$byte & 0x0F]); 95 | } 96 | } 97 | break; 98 | 99 | 100 | // 1 bit BMP 101 | case 1: 102 | for( $i=1, $y = $height-1; $y > -1; $y--, $i += $skip ) { 103 | for( $x=0; $x<$width; $x+=8, $i++ ) { 104 | $byte = &$imageData[$i]; 105 | imagesetpixel($img, $x+0, $y, $imagePalette[ !!($byte & 0x80) ]); 106 | imagesetpixel($img, $x+1, $y, $imagePalette[ !!($byte & 0x40) ]); 107 | imagesetpixel($img, $x+2, $y, $imagePalette[ !!($byte & 0x20) ]); 108 | imagesetpixel($img, $x+3, $y, $imagePalette[ !!($byte & 0x10) ]); 109 | imagesetpixel($img, $x+4, $y, $imagePalette[ !!($byte & 0x08) ]); 110 | imagesetpixel($img, $x+5, $y, $imagePalette[ !!($byte & 0x04) ]); 111 | imagesetpixel($img, $x+6, $y, $imagePalette[ !!($byte & 0x02) ]); 112 | imagesetpixel($img, $x+7, $y, $imagePalette[ !!($byte & 0x01) ]); 113 | } 114 | } 115 | break; 116 | } 117 | 118 | 119 | return $img; 120 | } 121 | 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ROChargenPHP 2 | ======== 3 | 4 | 5 | > *ROChargenPHP* is a PHP tool made for Ragnarok Online private server to help them to 6 | > solved a big problem : how to display game characters on the website ? 7 | > So this tool comes at the rescue, parsing game data to render as an image the 8 | > character/monster of your choice, base on your database or direct informations. 9 | 10 | 11 | It required PHP5 with the PDO driver installed. 12 | All the settings are set in index.php file. 13 | 14 | Features 15 | --------- 16 | 17 | - Generator 18 | * Support .spr, .act, .pal, .grf files 19 | * A character is fully render (class, head, hats, palettes, weapon, shield, robes, mount) and you 20 | can set the action, direction, animation easily. 21 | * Generator for Character, Character head only, Monsters, Homunculus, Avatar and Signature. 22 | * Cache system if needed 23 | * Emblem loader 24 | 25 | - Client 26 | * DATA.ini files to set your own GRF to read files from. 27 | * Support GRF (0x200 version only without DES encryption) the data fodler is always read first. 28 | * Auto-Extract files from GRF if needed. 29 | * Updater script available to convert some lua files to PHP. 30 | 31 | How to use 32 | --------- 33 | 34 | ``` 35 | http://www.example.com/ROChargenPHP/controller/data 36 | ``` 37 | Replace *controller* by the one you want (currently: *character*, *characterhead*, *avatar*, *signature*). 38 | Replace *data* with the info you want to send to the controller (by default the name of the player. 39 | Example: 40 | ``` 41 | http://www.example.com/ROChargenPHP/avatar/KeyWorld 42 | ``` 43 | 44 | Will display KeyWorld's avatar. 45 | If you don't have url-rewriting in your host the link you will have to use: 46 | ``` 47 | http://www.example.com/ROChargenPHP/index.php/avatar/KeyWorld 48 | ``` 49 | 50 | You can change the default link by modify the array *$routes* in the *index.php* file: 51 | ```php 52 | $routes['/avatar/(.*)'] = 'Avatar'; 53 | $routes['/character/(.*)'] = 'Character'; 54 | $routes['/characterhead/(.*)'] = 'CharacterHead'; 55 | $routes['/monster/(\d+)'] = 'Monster'; 56 | $routes['/signature/(.*)'] = 'Signature'; 57 | ``` 58 | 59 | Custom display 60 | --------- 61 | At least, the tool is really easy to use, here an example on how to display a static character: 62 | ```php 63 | $chargen = new CharacterRender(); 64 | $chargen->action = CharacterRender::ACTION_READYFIGHT; 65 | $chargen->direction = CharacterRender::DIRECTION_SOUTHEAST; 66 | $chargen->body_animation = 0; 67 | $chargen->doridori = 0; 68 | 69 | // Custom data: 70 | $chargen->sex = "M"; 71 | $chargen->class = 4002; 72 | $chargen->clothes_color = 0; 73 | $chargen->hair = 5; 74 | $chargen->hair_color = 12; 75 | // ... head_top, head_mid, head_bottom, robe, weapon, shield, sex, ... 76 | 77 | 78 | // Generate Image 79 | $img = $chargen->render(); 80 | imagepng($img); 81 | ``` 82 | 83 | ------- 84 | Avatar and signature 85 | ------- 86 | ![AvatarType1](http://upload.robrowser.com/chargen/avatar1.png) ![AvatarType2](http://upload.robrowser.com/chargen/avatar2.png) ![Signature](http://upload.robrowser.com/chargen/signature.png) 87 | 88 | ------- 89 | Full character, or just the head 90 | ------- 91 | ![head](http://upload.robrowser.com/chargen/head-keyworld.png) ![body](http://upload.robrowser.com/chargen/body-keyworld.png) 92 | 93 | ------- 94 | Monsters, without or with accessory 95 | ------- 96 | ![Eddga](http://upload.robrowser.com/chargen/1115.png) ![Poring](http://upload.robrowser.com/chargen/1002.png) 97 | 98 | ------- 99 | License 100 | --------- 101 | http://creativecommons.org/licenses/by-nc-sa/3.0/ 102 | 103 | ![License](http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png) 104 | -------------------------------------------------------------------------------- /core/class.Client.php: -------------------------------------------------------------------------------- 1 | $grf_filename ) { 45 | self::$grfs[$index] = new Grf(self::$path . $grf_filename); 46 | self::$grfs[$index]->filename = $grf_filename; 47 | $grfs[] = $grf_filename; 48 | } 49 | 50 | Debug::write('GRFs found in "'. self::$data_ini .'": '. implode(', ', $grfs), 'success' ); 51 | return; 52 | } 53 | 54 | Debug::write('File "'. self::$data_ini .'" isn\'t load : not set, not found, or not readable in "'. self::$path .'".', 'error'); 55 | } 56 | 57 | 58 | 59 | /** 60 | * Get a file from client, search it on data dir first, and on grfs. 61 | */ 62 | static public function getFile($path) 63 | { 64 | Debug::write('Trying to find file "'. $path .'"...', 'title'); 65 | 66 | $local_path = self::$path; 67 | $local_path .= str_replace('\\', '/', $path ); 68 | $grf_path = str_replace('/', '\\', $path ); 69 | 70 | // Read data first 71 | if ( file_exists($local_path) && !is_dir($local_path) && is_readable($local_path) ) { 72 | Debug::write('Find at "'. $local_path .'"', 'success'); 73 | return $local_path; 74 | } 75 | 76 | // Search in GRFS 77 | Debug::write('File not found in data folder.'); 78 | if( count(self::$grfs) ) { 79 | Debug::write('Searching in GRFs...'); 80 | } 81 | 82 | foreach( self::$grfs as $grf ) { 83 | 84 | // Load GRF just if needed 85 | if( !$grf->loaded ) { 86 | Debug::write('Loading GRF file "'. $grf->filename .'"...', 'info'); 87 | $grf->load(); 88 | } 89 | 90 | // If file is found 91 | if( $grf->getFile($grf_path, $content) ) { 92 | 93 | Debug::write('Search in GRF "'. $grf->filename .'", found.', 'success'); 94 | 95 | // Auto Extract GRF files ? 96 | if( self::$AutoExtract ) { 97 | 98 | Debug::write('Saving file to data folder...', 'info'); 99 | 100 | $current_path = self::$path; 101 | $directories = explode('/', $path); 102 | array_pop($directories); 103 | 104 | // Creating directories 105 | foreach( $directories as $dir ) { 106 | $current_path .= $dir . DIRECTORY_SEPARATOR; 107 | 108 | if( !file_exists($current_path) ) { 109 | mkdir( $current_path ); 110 | } 111 | } 112 | 113 | // Saving file 114 | file_put_contents( $local_path, $content); 115 | return $local_path; 116 | } 117 | 118 | return "data://application/octet-stream;base64," . base64_encode($content); 119 | } 120 | 121 | Debug::write('Search in GRF "'. $grf->filename .'", fail.'); 122 | } 123 | 124 | Debug::write('File not found...', 'error'); 125 | return false; 126 | } 127 | 128 | 129 | /** 130 | * Search files (only work in GRF) 131 | */ 132 | static public function search($filter) { 133 | $out = array(); 134 | 135 | foreach( self::$grfs as $grf ) { 136 | 137 | // Load GRF only if needed 138 | if( !$grf->loaded ) { 139 | $grf->load(); 140 | } 141 | 142 | // Search 143 | $list = $grf->search($filter); 144 | 145 | // Merge 146 | $out = array_unique( array_merge($out, $list ) ); 147 | } 148 | 149 | //sort($out); 150 | return $out; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /controllers/avatar.php: -------------------------------------------------------------------------------- 1 | getPlayerData($pseudo); 50 | $this->render($data); 51 | 52 | // Save 53 | Cache::save(); 54 | } 55 | 56 | 57 | /** 58 | * Get player data from SQL 59 | */ 60 | private function getPlayerData($pseudo) 61 | { 62 | $data = $this->query(" 63 | SELECT 64 | char.name, 65 | char.class, char.clothes_color, 66 | char.hair, char.hair_color, 67 | char.head_top, char.head_mid, char.head_bottom, 68 | char.robe, char.weapon, char.shield, 69 | char.online, char.base_level, char.job_level, 70 | login.sex, 71 | guild.emblem_data 72 | FROM `char` 73 | LEFT JOIN `login` ON login.account_id = char.account_id 74 | LEFT JOIN `guild` ON guild.guild_id = char.guild_id 75 | WHERE char.name = ? 76 | LIMIT 1", 77 | array($pseudo) 78 | ); 79 | 80 | // No player found ? 81 | // No character found ? Load a default character ? 82 | if( empty($data) ) 83 | { 84 | Cache::setFilename("[notfound].png"); 85 | $content = ""; 86 | 87 | if( Cache::get($content) ) { 88 | die($content); 89 | } 90 | 91 | return array( 92 | "class" => 0, 93 | "clothes_color" => 0, 94 | "hair" => 2, 95 | "hair_color" => 0, 96 | "head_top" => 0, 97 | "head_mid" => 0, 98 | "head_bottom" => 0, 99 | "robe" => 0, 100 | "weapon" => 0, 101 | "shield" => 0, 102 | "sex" => "M", 103 | "online" => 0, 104 | "base_level" => 0, 105 | "job_level" => 0, 106 | "name" => "Unknown" 107 | ); 108 | } 109 | 110 | return $data[0]; 111 | } 112 | 113 | 114 | /** 115 | * Render avatar 116 | */ 117 | private function render($data) 118 | { 119 | // Load Class and set parameters 120 | $chargen = new CharacterRender(); 121 | $chargen->action = CharacterRender::ACTION_IDLE; 122 | $chargen->direction = CharacterRender::DIRECTION_SOUTH; 123 | $chargen->body_animation = 0; 124 | $chargen->doridori = 0; 125 | $chargen->loadFromSqlData($data); 126 | 127 | // Load images 128 | $player = $chargen->render(); 129 | $border = imagecreatefrompng( Cache::$path . "avatar/data/border.png" ); 130 | $background = imagecreatefromjpeg( Cache::$path . "avatar/data/background01.jpg" ); 131 | $output = imagecreatetruecolor( 128, 128 ); 132 | 133 | // Build image 134 | imagecopy( $output, $background, 7, 7, 0, 0, 114, 114 ); 135 | imagecopy( $output, $player, 7, 7, 35+7, 65+7, imagesx($player)-14, imagesx($player)-14 ); 136 | imagecopy( $output, $border, 0, 0, 0, 0, 128, 128 ); 137 | 138 | // Add emblem 139 | if( !empty($data['emblem_data']) ) { 140 | $binary = @gzuncompress(pack('H*', $data['emblem_data'])); 141 | 142 | if( $binary && ($emblem = imagecreatefrombmpstring($binary)) ) { 143 | imagecopy( $output, $emblem, 128-10-24, 128-10-24, 0, 0, 24, 24 ); 144 | } 145 | } 146 | 147 | // Set color for text 148 | $name_color = imagecolorallocate($output, 122, 122, 122); 149 | $lvl_color = imagecolorallocate($output, 185, 109, 179 ); 150 | $status_color = $data['online'] ? imagecolorallocate($output, 59, 129, 44 ) : imagecolorallocate($output, 188, 98, 98 ); 151 | 152 | // Draw text 153 | imagestring( $output, 1, 12, 12, strtoupper($data['name']), $name_color ); 154 | imagestring( $output, 1, 12, 25, $data['base_level'] . "/" . $data['job_level'], $lvl_color ); 155 | imagestring( $output, 1, 81, 12, $data['online'] ? "ONLINE" : "OFFLINE", $status_color ); 156 | 157 | imagepng($output); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /controllers/signature.php: -------------------------------------------------------------------------------- 1 | getPlayerData($pseudo); 50 | $this->render($data); 51 | 52 | // Save 53 | Cache::save(); 54 | } 55 | 56 | 57 | /** 58 | * Get player data from SQL 59 | */ 60 | private function getPlayerData($pseudo) 61 | { 62 | $data = $this->query(" 63 | SELECT 64 | char.name, 65 | char.class, char.clothes_color, 66 | char.hair, char.hair_color, 67 | char.head_top, char.head_mid, char.head_bottom, 68 | char.robe, char.weapon, char.shield, 69 | char.online, char.base_level, char.job_level, 70 | login.sex, 71 | guild.emblem_data 72 | FROM `char` 73 | LEFT JOIN `login` ON login.account_id = char.account_id 74 | LEFT JOIN `guild` ON guild.guild_id = char.guild_id 75 | WHERE char.name = ? 76 | LIMIT 1", 77 | array($pseudo) 78 | ); 79 | 80 | // No player found ? 81 | // No character found ? Load a default character ? 82 | if( empty($data) ) 83 | { 84 | Cache::setFilename("[notfound].png"); 85 | $content = ""; 86 | 87 | if( Cache::get($content) ) { 88 | die($content); 89 | } 90 | 91 | return array( 92 | "class" => 0, 93 | "clothes_color" => 0, 94 | "hair" => 2, 95 | "hair_color" => 0, 96 | "head_top" => 0, 97 | "head_mid" => 0, 98 | "head_bottom" => 0, 99 | "robe" => 0, 100 | "weapon" => 0, 101 | "shield" => 0, 102 | "sex" => "M", 103 | "online" => 0, 104 | "base_level" => 0, 105 | "job_level" => 0, 106 | "name" => "Unknown" 107 | ); 108 | } 109 | 110 | return $data[0]; 111 | } 112 | 113 | 114 | /** 115 | * Render avatar 116 | */ 117 | private function render($data) 118 | { 119 | // Load Class and set parameters 120 | $chargen = new CharacterRender(); 121 | $chargen->action = CharacterRender::ACTION_SIT; 122 | $chargen->direction = CharacterRender::DIRECTION_SOUTHEAST; 123 | $chargen->body_animation = 0; 124 | $chargen->doridori = 0; 125 | $chargen->loadFromSqlData($data); 126 | 127 | 128 | // Build background 129 | $player = $chargen->render(); 130 | $output = imagecreatetruecolor( 194, 110 ); 131 | $background = imagecreatefromjpeg( Cache::$path . "signature/data/background01.jpg"); 132 | imagecopy( $output, $background, 2, 2, 0, 0, 190, 106 ); 133 | imagecopy( $output, $player, 2, 2, 55, 80, imagesx($player)-55-4, imagesx($player)-90-4 ); 134 | 135 | // Add emblem 136 | if( !empty($data['emblem_data']) ) { 137 | $binary = @gzuncompress(pack('H*', $data['emblem_data'])); 138 | 139 | if( $binary && ($emblem = imagecreatefrombmpstring($binary)) ) { 140 | imagecopy( $output, $emblem, 194-6-24, 6, 0, 0, 24, 24 ); 141 | } 142 | } 143 | 144 | // Set color for text 145 | $name_color = imagecolorallocate($output, 254, 242, 183); 146 | $lvl_color = imagecolorallocate($output, 240, 143, 89); 147 | $status_color = $data['online'] ? imagecolorallocate($output, 125, 196, 126 ) : imagecolorallocate($output, 190, 83, 83 ); 148 | 149 | // Text align right func 150 | function imagestringright( &$img, $size, $x, $y, $str, $color ) { 151 | imagestring( $img, $size, $x - strlen($str) * imagefontwidth($size), $y, $str, $color ); 152 | } 153 | 154 | // Draw text 155 | imagestringright( $output, 2, 187, 69, $data['name'], $name_color ); 156 | imagestringright( $output, 2, 187, 82, $data['base_level'] . "/" . $data['job_level'], $lvl_color ); 157 | imagestringright( $output, 2, 187, 93, $data['online'] ? "Online" : "Offline", $status_color ); 158 | 159 | // Cache the image 160 | imagepng($output); 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /db/shadow.php: -------------------------------------------------------------------------------- 1 | 0, 14 | 1004 => 0.5, 15 | 1005 => 0.5, 16 | 1007 => 0.5, 17 | 1008 => 0.3, 18 | 1009 => 0.7, 19 | 1011 => 0.5, 20 | 1013 => 1.2, 21 | 1018 => 0.7, 22 | 1019 => 1.2, 23 | 1020 => 0, 24 | 1025 => 0, 25 | 1030 => 0, 26 | 1035 => 0.5, 27 | 1037 => 0, 28 | 1039 => 1.2, 29 | 1040 => 2, 30 | 1042 => 0.5, 31 | 1046 => 0, 32 | 1047 => 0.2, 33 | 1048 => 0.2, 34 | 1049 => 0.3, 35 | 1050 => 0.3, 36 | 1051 => 0.3, 37 | 1056 => 0.7, 38 | 1057 => 0.7, 39 | 1061 => 1.5, 40 | 1063 => 0.5, 41 | 1069 => 1.2, 42 | 1070 => 0.3, 43 | 1072 => 0.5, 44 | 1074 => 0.5, 45 | 1078 => 0, 46 | 1079 => 0, 47 | 1080 => 0, 48 | 1081 => 0, 49 | 1082 => 0, 50 | 1083 => 0, 51 | 1084 => 0, 52 | 1085 => 0, 53 | 1087 => 1.2, 54 | 1089 => 1.5, 55 | 1090 => 1, 56 | 1091 => 0.5, 57 | 1092 => 1.2, 58 | 1094 => 0.7, 59 | 1095 => 0.5, 60 | 1097 => 0.2, 61 | 1098 => 2, 62 | 1101 => 0.5, 63 | 1102 => 1.2, 64 | 1103 => 0.3, 65 | 1104 => 0.7, 66 | 1105 => 0.7, 67 | 1106 => 1.2, 68 | 1107 => 0.7, 69 | 1108 => 0.7, 70 | 1109 => 0.7, 71 | 1110 => 0.7, 72 | 1111 => 0.5, 73 | 1114 => 0.5, 74 | 1115 => 1.2, 75 | 1121 => 0.7, 76 | 1127 => 0, 77 | 1129 => 0.5, 78 | 1131 => 0, 79 | 1138 => 0, 80 | 1139 => 0.5, 81 | 1140 => 1.2, 82 | 1141 => 0.5, 83 | 1142 => 0.5, 84 | 1143 => 0.5, 85 | 1145 => 0.5, 86 | 1147 => 1.5, 87 | 1149 => 1.5, 88 | 1155 => 0.5, 89 | 1156 => 0.5, 90 | 1158 => 0.7, 91 | 1159 => 1.2, 92 | 1160 => 0.7, 93 | 1161 => 0.5, 94 | 1162 => 0.5, 95 | 1167 => 0.5, 96 | 1170 => 0.7, 97 | 1174 => 0.5, 98 | 1175 => 0.5, 99 | 1176 => 0.7, 100 | 1182 => 0, 101 | 1183 => 0.5, 102 | 1184 => 0.5, 103 | 1186 => 2, 104 | 1190 => 1.2, 105 | 1192 => 1.5, 106 | 1193 => 2, 107 | 1194 => 0.5, 108 | 1195 => 0.5, 109 | 1199 => 0.5, 110 | 1201 => 1.2, 111 | 1202 => 1.5, 112 | 1203 => 0.5, 113 | 1204 => 0.5, 114 | 1208 => 1.2, 115 | 1209 => 0.7, 116 | 1211 => 0.5, 117 | 1214 => 0.7, 118 | 1219 => 5, 119 | 1248 => 0.7, 120 | 1249 => 1.2, 121 | 1250 => 0.5, 122 | 1252 => 2, 123 | 1254 => 0.7, 124 | 1255 => 0.5, 125 | 1256 => 0.5, 126 | 1261 => 0.7, 127 | 1262 => 1.2, 128 | 1266 => 0, 129 | 1268 => 2, 130 | 1270 => 1.5, 131 | 1272 => 1.5, 132 | 1274 => 1.2, 133 | 1277 => 0.5, 134 | 1278 => 2, 135 | 1279 => 0.5, 136 | 1281 => 0.5, 137 | 1283 => 2, 138 | 1289 => 1.5, 139 | 1291 => 1.5, 140 | 1292 => 0.7, 141 | 1293 => 0.7, 142 | 1295 => 1.2, 143 | 1300 => 0.5, 144 | 1301 => 0.7, 145 | 1302 => 0, 146 | 1309 => 0.5, 147 | 1310 => 1.5, 148 | 1312 => 1.5, 149 | 1320 => 1.2, 150 | 1365 => 2, 151 | 1368 => 0.5, 152 | 1371 => 0.5, 153 | 1372 => 1.2, 154 | 1373 => 2, 155 | 1375 => 0.5, 156 | 1378 => 0.5, 157 | 1379 => 1.5, 158 | 1382 => 0.7, 159 | 1383 => 0.5, 160 | 1384 => 0.7, 161 | 1385 => 0.7, 162 | 1389 => 0, 163 | 1395 => 0.5, 164 | 1396 => 0.5, 165 | 1397 => 0.5, 166 | 1398 => 0.5, 167 | 1401 => 0, 168 | 1402 => 0.7, 169 | 1405 => 1.2, 170 | 1408 => 1.2, 171 | 1410 => 1.5, 172 | 1412 => 2, 173 | 1413 => 0.5, 174 | 1418 => 2, 175 | 1492 => 2, 176 | 1497 => 2, 177 | 1498 => 1.5, 178 | 1499 => 1.5, 179 | 1507 => 2, 180 | 1508 => 0.5, 181 | 1509 => 0.5, 182 | 1510 => 0.5, 183 | 1516 => 0, 184 | 1519 => 0.7, 185 | 1584 => 1.2, 186 | 1586 => 0.5, 187 | 1587 => 0.5, 188 | 1614 => 0.5, 189 | 1615 => 0.5, 190 | 1617 => 1.5, 191 | 1618 => 1.5, 192 | 1619 => 0.3, 193 | 1620 => 0, 194 | 1621 => 0, 195 | 1622 => 0.3, 196 | 1623 => 2, 197 | 1627 => 0.3, 198 | 1628 => 0.5, 199 | 1631 => 0.7, 200 | 1633 => 0.5, 201 | 1664 => 0.5, 202 | 1665 => 0.5, 203 | 1666 => 0.5, 204 | 1667 => 0.5, 205 | 1685 => 2, 206 | 1686 => 0.5, 207 | 1692 => 0.5, 208 | 1693 => 0.7, 209 | 1694 => 0.7, 210 | 1695 => 0.7, 211 | 1696 => 0.7, 212 | 1697 => 0.7, 213 | 1702 => 1.2, 214 | 1703 => 0.5, 215 | 1704 => 1.5, 216 | 1705 => 0.7, 217 | 1707 => 0.5, 218 | 1708 => 2, 219 | 1713 => 2, 220 | 1714 => 1.2, 221 | 1715 => 0.7, 222 | 1716 => 2, 223 | 1717 => 1.2, 224 | 1718 => 0.7, 225 | 1719 => 2, 226 | 1720 => 1.2, 227 | 1729 => 0.5, 228 | 1738 => 0.5, 229 | 1768 => 2, 230 | 1775 => 2, 231 | 1777 => 2, 232 | 1778 => 2, 233 | 1779 => 1.5, 234 | 1780 => 0.5, 235 | 1781 => 0.7, 236 | 1782 => 0.5, 237 | 1785 => 2, 238 | 1789 => 0, 239 | 1792 => 0, 240 | 1795 => 2, 241 | 1831 => 1.2, 242 | 1832 => 1.2, 243 | 1866 => 1.2, 244 | 1870 => 1.2, 245 | 1873 => 2, 246 | 1874 => 2, 247 | 1875 => 1.2, 248 | 1877 => 0.5, 249 | 1882 => 0, 250 | 1885 => 2, 251 | 1889 => 2, 252 | 1916 => 2, 253 | 1917 => 2, 254 | 1928 => 0.7, 255 | 1929 => 2, 256 | 1934 => 0, 257 | 1935 => 0, 258 | 1936 => 0, 259 | 1951 => 0.5, 260 | 1952 => 0.5, 261 | 1953 => 0.5, 262 | 1954 => 0.5, 263 | 1956 => 2, 264 | 1964 => 1.5, 265 | 1975 => 2, 266 | 1976 => 0.7, 267 | 1978 => 2, 268 | 1986 => 0.5, 269 | 1990 => 2, 270 | 1991 => 2, 271 | 1992 => 1.5, 272 | 1993 => 1.5, 273 | 1999 => 0.5, 274 | 2008 => 2, 275 | 2009 => 2, 276 | 2013 => 0.7, 277 | 2018 => 2, 278 | 2019 => 2, 279 | 2020 => 0.5, 280 | 2021 => 0.7, 281 | 2024 => 2, 282 | 2025 => 1.2, 283 | 2032 => 0.5, 284 | 2040 => 0.5, 285 | 2041 => 0.5, 286 | 2042 => 0.5, 287 | 2047 => 1.5, 288 | 2049 => 2, 289 | 2068 => 2, 290 | 2071 => 1.5, 291 | 2079 => 2, 292 | 2080 => 2, 293 | 2087 => 1.2, 294 | 2090 => 0.7, 295 | 2092 => 1.5, 296 | 2131 => 2, 297 | 2132 => 1.2, 298 | 2134 => 0.5, 299 | 2135 => 0.7, 300 | 2137 => 0.5, 301 | 2138 => 0.5, 302 | 2139 => 0.5, 303 | 2140 => 0.5, 304 | 2141 => 0.5, 305 | 2142 => 0.5, 306 | 2143 => 0.5, 307 | 2152 => 1.5, 308 | 2153 => 0.5, 309 | 2155 => 1.2, 310 | 2186 => 2, 311 | 2187 => 2, 312 | 2188 => 2, 313 | 2189 => 2, 314 | 2190 => 2, 315 | 2198 => 1.5, 316 | 2201 => 0.5, 317 | 2202 => 1.5, 318 | 2203 => 0.5, 319 | 2246 => 1.5, 320 | 2247 => 0, 321 | 2252 => 0.7, 322 | 2253 => 1.5, 323 | 2255 => 2, 324 | 2256 => 0.5, 325 | 2309 => 2, 326 | 2313 => 1.5, 327 | 2314 => 0.5, 328 | 2317 => 2, 329 | 2318 => 2, 330 | 2319 => 1.5, 331 | 2327 => 2, 332 | 2329 => 0.5, 333 | 2330 => 0.5, 334 | 2332 => 1.5, 335 | 2333 => 0, 336 | 2364 => 0, 337 | 2365 => 0, 338 | 2367 => 0.5, 339 | 2368 => 0.5, 340 | 2369 => 0.5, 341 | 2370 => 0.5, 342 | 2371 => 2, 343 | 2398 => 0.5, 344 | 2404 => 0.7, 345 | 2408 => 0.5, 346 | 2409 => 0.5, 347 | 2410 => 0.5, 348 | 2413 => 0.5, 349 | 2414 => 0.5, 350 | 2451 => 0.5, 351 | 6003 => 0.5, 352 | 6004 => 0.5, 353 | 6005 => 0.5, 354 | 6006 => 0.7, 355 | 6007 => 0.5, 356 | 6008 => 0.5, 357 | 6010 => 1.2, 358 | 6012 => 0, 359 | 6015 => 1.2, 360 | 6016 => 1.2, 361 | 6049 => 1.2, 362 | 6051 => 1.2 363 | ); 364 | -------------------------------------------------------------------------------- /core/class.DB.php: -------------------------------------------------------------------------------- 1 | "\xb3\xb2", 19 | "F" => "\xbf\xa9" 20 | ); 21 | 22 | static public $path = "db/"; 23 | 24 | 25 | // Return shadow factor 26 | static public function get_shadow_factor($id) { 27 | if( empty(self::$shadow) ) 28 | self::$shadow = require_once( self::$path . 'shadow.php'); 29 | 30 | return isset(self::$shadow[$id]) ? self::$shadow[$id] : 1; 31 | } 32 | 33 | // Return Entity path 34 | static public function get_entity_path($id) { 35 | if( $id < 45 ) return false; // character, don't render 36 | else if( $id < 46 ) return false; // warp 37 | else if( $id < 1000 ) return self::get_npc_path($id); 38 | else if( $id < 4000 ) return self::get_monster_path($id); 39 | else if( $id < 6000 ) return false; // character 40 | else if( $id < 7000 ) return self::get_homunculus_path($id); 41 | 42 | return false; 43 | } 44 | 45 | 46 | // Return npc path 47 | static public function get_npc_path($id) 48 | { 49 | // Load only if used 50 | if( empty(self::$mobs) ) { 51 | self::$mobs = require_once( self::$path . 'mobs.php'); 52 | } 53 | 54 | return "data/sprite/npc/" . strtolower( ( isset(self::$mobs[$id]) ? self::$mobs[$id] : "1_ETC_01") ); 55 | } 56 | 57 | // Return homunculus path 58 | static public function get_homunculus_path($id) 59 | { 60 | // Load only if used 61 | if( empty(self::$mobs) ) { 62 | self::$mobs = require_once( self::$path . 'mobs.php'); 63 | } 64 | 65 | return "data/sprite/homun/" . strtolower(self::$mobs[ isset(self::$mobs[$id]) ? $id : 1002 ]); 66 | } 67 | 68 | // Return mob path 69 | static public function get_monster_path($id) 70 | { 71 | // Load only if used 72 | if( empty(self::$mobs) ) { 73 | self::$mobs = require_once( self::$path . 'mobs.php'); 74 | } 75 | 76 | return "data/sprite/\xb8\xf3\xbd\xba\xc5\xcd/" . strtolower(self::$mobs[ isset(self::$mobs[$id]) ? $id : 1002 ]); 77 | } 78 | 79 | // Return pet accessory path 80 | static public function get_pet_accessory($id) 81 | { 82 | // Load only if used 83 | if( empty(self::$pets) ) { 84 | self::$pets = require_once( self::$path . 'pets.php'); 85 | } 86 | 87 | return isset(self::$pets[$id]) ? "data/sprite/\xb8\xf3\xbd\xba\xc5\xcd/" . self::$pets[$id] : false; 88 | } 89 | 90 | // Return body path 91 | static public function get_body_path($id,$sex) 92 | { 93 | $sex = self::$ascii_sex[$sex]; 94 | 95 | // Load only if used 96 | if( empty(self::$body) ) { 97 | self::$body = require_once( self::$path . 'body.php'); 98 | } 99 | 100 | return "data/sprite/\xc0\xce\xb0\xa3\xc1\xb7/\xb8\xf6\xc5\xeb/{$sex}/". self::$body[ isset(self::$body[$id]) ? $id : 0 ] ."_{$sex}"; 101 | } 102 | 103 | // Return body pal path 104 | static public function get_body_pal_path($id,$sex,$pal) 105 | { 106 | $sex = self::$ascii_sex[$sex]; 107 | 108 | if( empty(self::$pals) ) { 109 | self::$pals = require_once( self::$path . 'pals.php'); 110 | } 111 | 112 | if ( $pal && isset(self::$pals[$id]) ) { 113 | return "data/palette/\xb8\xf6/". self::$pals[$id] ."_{$sex}_{$pal}.pal"; 114 | } 115 | 116 | return false; 117 | } 118 | 119 | // Return head path 120 | static public function get_head_path($id,$sex) 121 | { 122 | $_sex = self::$ascii_sex[$sex]; 123 | 124 | //Is head order only use on character creation ? 125 | /* 126 | if( empty(self::$hair) ) { 127 | self::$hair = require_once( self::$path . 'hair.client.php'); 128 | } 129 | 130 | $id = isset(self::$hair[$sex][$id]) ? self::$hair[$sex][$id] : 2; 131 | */ 132 | return "data/sprite/\xc0\xce\xb0\xa3\xc1\xb7/\xb8\xd3\xb8\xae\xc5\xeb/{$_sex}/{$id}_{$_sex}"; 133 | } 134 | 135 | // Return head pal path 136 | static public function get_head_pal_path($id,$sex,$pal) 137 | { 138 | $sex = self::$ascii_sex[$sex]; 139 | return $pal ? "data/palette/\xb8\xd3\xb8\xae/\xb8\xd3\xb8\xae{$id}_{$sex}_{$pal}.pal" : false; 140 | } 141 | 142 | // Return hat path 143 | static public function get_hat_path($id,$sex) 144 | { 145 | $sex = self::$ascii_sex[$sex]; 146 | 147 | if( empty(self::$hats) ) { 148 | self::$hats = require_once( self::$path . 'hats.php'); 149 | } 150 | 151 | return isset(self::$hats[$id]) ? "data/sprite/\xbe\xc7\xbc\xbc\xbb\xe7\xb8\xae/{$sex}/{$sex}_" . self::$hats[$id] : false; 152 | } 153 | 154 | // Return weapon path 155 | static public function get_weapon_path($job_id, $sex, $weapon_id ) 156 | { 157 | $sex = self::$ascii_sex[$sex]; 158 | 159 | if( empty(self::$weapon) ) self::$weapon = require_once( self::$path . 'weapon.php'); 160 | if( empty(self::$body) ) self::$body = require_once( self::$path . 'body.php'); 161 | 162 | $weapon_id = isset(self::$weapon[$weapon_id]) ? self::$weapon[$weapon_id] : $weapon_id; 163 | return isset(self::$body[$job_id]) ? "data/sprite/\xc0\xce\xb0\xa3\xc1\xb7/". self::$body[$job_id] ."/". self::$body[$job_id] ."_{$sex}_{$weapon_id}" : false; 164 | } 165 | 166 | // Return shield path 167 | static public function get_shield_path($job_id, $sex, $shield_id ) 168 | { 169 | $sex = self::$ascii_sex[$sex]; 170 | 171 | if( empty(self::$shield)) self::$shield = require_once( self::$path . 'shield.php'); 172 | if( empty(self::$body) ) self::$body = require_once( self::$path . 'body.php'); 173 | 174 | $shield_id = isset(self::$shield[ $shield_id ]) ? self::$shield[ $shield_id ] : $shield_id; 175 | return isset(self::$body[$job_id]) ? "data/sprite/\xb9\xe6\xc6\xd0/". self::$body[$job_id] ."/". self::$body[$job_id] ."_{$sex}_{$shield_id}" : false; 176 | } 177 | 178 | // Return robe path 179 | static public function get_robe_path( $job_id, $sex, $robe_id ) 180 | { 181 | $sex = self::$ascii_sex[$sex]; 182 | 183 | if( empty(self::$robes['list']) ) { 184 | self::$robes['list'] = require_once( self::$path . 'robe.php'); 185 | self::$robes['inherit'] = require_once( self::$path . 'inherit.robe.php'); 186 | } 187 | 188 | if ( empty(self::$robes['list'][$robe_id]) || !isset(self::$body[$job_id]) ) { 189 | return false; 190 | } 191 | 192 | return "data/sprite/\xb7\xce\xba\xea/". self::$robes['list'][$robe_id]['name'] ."/{$sex}/". self::$body[$job_id] ."_{$sex}"; 193 | } 194 | 195 | // Return robe zIndex 196 | static public function robe_ontop( $job_id, $_sex, $robe_id, $action, $animation ) 197 | { 198 | $sex = self::$ascii_sex[$_sex]; 199 | $size = '2dlayer'; 200 | 201 | if ( $robe_id !== false ) { 202 | if ( empty(self::$robes['list'][$robe_id]) ) 203 | return false; 204 | 205 | $size = self::$robes['list'][$robe_id]['size']; 206 | } 207 | 208 | if( !isset(self::$robes[$size]) ) { 209 | self::$robes[$size] = array(); 210 | } 211 | 212 | if( empty(self::$robes[$size][$sex]) ) { 213 | self::$robes[$size][$sex] = require_once( self::$path . $size . '_'. $_sex .'.robe.php'); 214 | } 215 | 216 | $table = self::$robes[$size][$sex]; 217 | 218 | if( !empty(self::$robes['inherit'][$job_id]) ) 219 | $job_id = self::$robes['inherit'][$job_id]; 220 | 221 | if ( empty($table[$job_id]) || empty($table[$job_id][$action]) ) return true; 222 | if ( in_array( $animation, $table[$job_id][$action] ) ) return false; 223 | 224 | return true; 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /controllers/update.php: -------------------------------------------------------------------------------- 1 | updateHats(); break; 27 | case 'mobs': $this->updateMonsters(); break; 28 | case 'robes': $this->updateRobes(); break; 29 | default: exit('Invalid type specified'); 30 | } 31 | 32 | exit('Update success'); 33 | } 34 | 35 | 36 | /** 37 | * Check if files exists 38 | */ 39 | private function needFiles() 40 | { 41 | $args = func_get_args(); 42 | foreach( $args as $path ) { 43 | if( !file_exists( Client::$path . $path ) ) { 44 | exit('File "'. Client::$path . $path .'" not found.'); 45 | } 46 | } 47 | } 48 | 49 | 50 | /** 51 | * Updating DB files (hats) 52 | */ 53 | private function updateHats() 54 | { 55 | $error = ""; 56 | $buffer = $this->parse_easy(array( 57 | "keys" => array( 58 | "lua" => "lua files/datainfo/accessoryid.lua", 59 | "reg" => "/ACCESSORY_([a-zA-Z0-9_-]+)(\s+)?\=(\s+)?(\d+)(,)?/" 60 | ), 61 | "vals" => array( 62 | "lua" => "lua files/datainfo/accname.lua", 63 | "reg" => "/\[ACCESSORY_IDs\.ACCESSORY_([a-zA-Z0-9_-]+)\](\s+)?=(\s+)?\"_(.*)\"(,)?/" 64 | ) 65 | ), $error ); 66 | 67 | $this->Output( 68 | "Hats view id", 69 | $buffer, 70 | $error, 71 | DB::$path . "hats.php" 72 | ); 73 | } 74 | 75 | 76 | /** 77 | * Updating DB files (mobs) 78 | */ 79 | private function updateMonsters() 80 | { 81 | $error = ""; 82 | $buffer = $this->parse_easy(array( 83 | "keys" => array( 84 | "lua" => "lua files/datainfo/npcidentity.lua", 85 | "reg" => '/\["JT_([^"]+)"\](\s+)?\=(\s+)?(\d+)(,)?/' 86 | ), 87 | "vals" => array( 88 | "lua" => "lua files/datainfo/jobname.lua", 89 | "reg" => '/\[jobtbl\.JT_([^]]+)\](\s+)?=(\s+)?"([^"]+)"(,)?/' 90 | ) 91 | ), $error ); 92 | 93 | $this->Output( 94 | "Monsters view id", 95 | $buffer, 96 | $error, 97 | DB::$path . "mobs.php" 98 | ); 99 | } 100 | 101 | 102 | /** 103 | * Updating DB files (robes) 104 | */ 105 | private function updateRobes() 106 | { 107 | $this->needFiles( 108 | "lua files/skillinfoz/jobinheritlist.lua", 109 | "lua files/spreditinfo/2dlayerdir_f.lua", 110 | "lua files/spreditinfo/biglayerdir_female.lua", 111 | "lua files/spreditinfo/biglayerdir_male.lua", 112 | "lua files/spreditinfo/smalllayerdir_female.lua", 113 | "lua files/spreditinfo/smalllayerdir_male.lua", 114 | "lua files/spreditinfo/2dlayerdir_female.lua", 115 | "lua files/spreditinfo/2dlayerdir_male.lua" 116 | ); 117 | 118 | $keys = array(); 119 | $keys_data = file_get_contents( Client::$path . "lua files/skillinfoz/jobinheritlist.lua"); 120 | 121 | // JT_key = val, 122 | preg_match_all( "/JT_([^\s]+)(\s+)?\=(\s+)?(\d+)(,)?/", $keys_data, $matches ); 123 | foreach( $matches[1] as $index => $name ) { 124 | $keys[ $name ] = $matches[4][$index]; 125 | } 126 | 127 | 128 | // Inherit 129 | $extends = file_get_contents( Client::$path . "lua files/spreditinfo/2dlayerdir_f.lua"); 130 | preg_match_all( "/\[JOBID\.JT_([^\]]+)\]\s=\sJOBID\.JT_([^\,]+)/", $extends, $matches ); 131 | $buffer = ""; 132 | $error = ""; 133 | 134 | foreach( $matches[1] as $index => $name ) { 135 | if( !isset($keys[ $name ]) ) { 136 | $error .= "// Fail to find '". $name . "'\n"; 137 | continue; 138 | } 139 | $buffer .= "\t". $keys[ $name ] ." => ". $keys[ $matches[2][$index] ] .",\n"; 140 | } 141 | 142 | $this->Output( 143 | "Robe inherit Job", 144 | $buffer, 145 | $error, 146 | DB::$path . 'inherit.robe.php' 147 | ); 148 | 149 | 150 | $list = array( 151 | "big_F.robe.php" => "lua files/spreditinfo/biglayerdir_female.lua", 152 | "big_M.robe.php" => "lua files/spreditinfo/biglayerdir_male.lua", 153 | "small_F.robe.php" => "lua files/spreditinfo/smalllayerdir_female.lua", 154 | "small_M.robe.php" => "lua files/spreditinfo/smalllayerdir_male.lua", 155 | "2dlayer_F.robe.php" => "lua files/spreditinfo/2dlayerdir_female.lua", 156 | "2dlayer_M.robe.php" => "lua files/spreditinfo/2dlayerdir_male.lua" 157 | ); 158 | 159 | foreach( $list as $php_file => $lua_file ) { 160 | $content = file_get_contents( Client::$path . $lua_file ); 161 | $error = ""; 162 | $this->Output( 163 | "Robe zIndex feature", 164 | $this->parse_harder($keys, $content, $error), 165 | $error, 166 | DB::$path . $php_file 167 | ); 168 | } 169 | } 170 | 171 | 172 | /** 173 | * Lua easy file parser 174 | */ 175 | private function parse_easy($data, &$error ) 176 | { 177 | $this->needFiles( 178 | $data['keys']['lua'], 179 | $data['vals']['lua'] 180 | ); 181 | 182 | $keys = array(); 183 | $vals = array(); 184 | 185 | // Parse keys 186 | $keys_data = file_get_contents( Client::$path . $data['keys']['lua']); 187 | preg_match_all( $data['keys']['reg'], $keys_data, $matches ); 188 | foreach( $matches[1] as $index => $name ) { 189 | $keys[ $name ] = $matches[4][$index]; 190 | } 191 | 192 | // Parse vals 193 | $vals_data = file_get_contents( Client::$path . $data['vals']['lua']); 194 | preg_match_all( $data['vals']['reg'], $vals_data, $matches ); 195 | foreach( $matches[1] as $index => $name ) { 196 | if( !isset($keys[$name]) ) { 197 | $error .= "// Fail to find '". $name . "'\n"; 198 | continue; 199 | } 200 | $vals[ $keys[$name] ] = $matches[4][$index]; 201 | } 202 | 203 | // Sort and output 204 | ksort($vals); 205 | settype( $buffer, "string"); 206 | foreach( $vals as $key => $val ) { 207 | $buffer .= "\t{$key} => '{$val}',\n"; 208 | } 209 | 210 | return substr( $buffer, 0, -2 ); 211 | } 212 | 213 | 214 | /** 215 | * Convert lua to php (harder) 216 | */ 217 | private function parse_harder($keys, $data, &$error) 218 | { 219 | $data = strstr( $data, '[' ); 220 | 221 | // [JOBID.JT_...] = { 222 | preg_match_all( '/\[JOBID\.JT_([^]]+)\](\s)?\=(\s)?\{/', $data, $matches ); 223 | 224 | // Remplace keys 225 | foreach( $matches[0] as $index => $array ) { 226 | if( !isset($keys[ $matches[1][$index] ]) ) { 227 | $error .= "// Fail to find '". $matches[1][$index] . "'\n"; 228 | continue; 229 | } 230 | $data = str_replace( $array, $keys[ $matches[1][$index] ] . " => array(", $data ); 231 | } 232 | 233 | // Remove: 234 | // - comment 235 | // - [d] = ... -> d => ... 236 | // - some error on "}" and "," 237 | $data = preg_replace('/--([^\n]+)/', '', $data); 238 | $data = preg_replace('/\[(\d+)\](\s+)?=(\s+)?\{(.*)\}(,)?/', '$1 => array($4)$5', $data); 239 | $data = preg_replace('/(\,)?(\s+)?\n\t\}(\,)?/', "\n\t)$3", $data ); 240 | 241 | return "\t" . substr($data,0,-1); 242 | } 243 | 244 | 245 | /** 246 | * Output the content 247 | */ 248 | private function Output( $title, $content, $error, $path ) 249 | { 250 | $buffer = <<open( $filename ); 34 | } 35 | } 36 | 37 | 38 | /** 39 | * Open a SPR file 40 | * Do some check before. 41 | */ 42 | public function open($filename) 43 | { 44 | if ( substr( $filename, 0, 7) !== "data://" ) { 45 | if ( ! file_exists($filename) ) 46 | throw new Exception("SPR::open() - Can't find file '{$filename}'."); 47 | 48 | if ( ! is_readable($filename) ) 49 | throw new Exception("SPR::open() - Can't read file '{$filename}'."); 50 | 51 | $this->size = filesize($filename); 52 | 53 | if ( $this->size < 0x06 ) 54 | throw new Exception("SPR::open() - Incorrect file size, shoulnot be a SPR file"); 55 | } 56 | 57 | $this->fp = fopen($filename,'r'); 58 | $this->load(); 59 | } 60 | 61 | 62 | /** 63 | * Parse a SPR file. 64 | */ 65 | private function load() 66 | { 67 | extract( unpack( "a2head/C2ver", fread($this->fp, 0x4 ) ) ); 68 | 69 | // Check header 70 | if ( $head !== 'SP' ) { 71 | throw new Exception("SPR::load() - Incorrect sprite header, is '{$head}' - should be 'SP'"); 72 | } 73 | 74 | // Get version 75 | $this->version = $ver1/10 + $ver2; 76 | $this->indexed_count = current( unpack( "v", fread($this->fp, 0x2) ) ); 77 | 78 | 79 | if ( $this->version > 1.1 ) { 80 | $this->rgba_count = current( unpack( "v", fread($this->fp, 0x2) ) ); 81 | } 82 | 83 | $this->rgba_index = $this->indexed_count; 84 | 85 | 86 | if ( $this->version < 2.1 ) { 87 | $this->readIndexedImage(); 88 | } 89 | else { 90 | $this->readIndexedImageRLE(); 91 | } 92 | 93 | $this->readRgbaImage(); 94 | 95 | // Read palettes. 96 | if ( $this->version > 1.0 ) { 97 | $this->palette = fread( $this->fp, 1024 ); 98 | } 99 | } 100 | 101 | 102 | /** 103 | * Read indexed image (palette system) 104 | */ 105 | private function readIndexedImage() 106 | { 107 | for ( $i=0; $i < $this->indexed_count; ++$i ) { 108 | $this->frames[$i] = (object) ( 109 | unpack("vwidth/vheight", fread($this->fp, 0x04)) + 110 | array( 111 | "type" => Sprite::TYPE_INDEXED, 112 | "offset" => ftell($this->fp), 113 | "data" => "" 114 | ) 115 | ); 116 | fseek( $this->fp, $this->frames[$i]->width * $this->frames[$i]->height, SEEK_CUR); 117 | } 118 | } 119 | 120 | 121 | /** 122 | * Parse SPR indexed images encoded with RLE 123 | */ 124 | private function readIndexedImageRLE() 125 | { 126 | for ( $i=0; $i < $this->indexed_count; ++$i ) { 127 | $this->frames[$i] = (object) ( 128 | unpack("vwidth/vheight/vsize", fread($this->fp, 0x06)) + 129 | array( 130 | "type" => Sprite::TYPE_INDEXED_RLE, 131 | "offset" => ftell($this->fp), 132 | "data" => "" 133 | ) 134 | ); 135 | fseek( $this->fp, $this->frames[$i]->size, SEEK_CUR); 136 | } 137 | } 138 | 139 | 140 | /** 141 | * Parse SPR rgba images 142 | */ 143 | private function readRgbaImage() 144 | { 145 | for ( $i=0, $f= $this->rgba_index; $i < $this->rgba_count; ++$i, $f++ ) { 146 | $this->frames[$f] = (object) ( 147 | unpack("vwidth/vheight", fread($this->fp, 0x04)) + 148 | array( 149 | "type" => Sprite::TYPE_RGBA, 150 | "offset" => ftell($this->fp), 151 | "data" => "" 152 | ) 153 | ); 154 | fseek( $this->fp, $this->frames[$f]->width * $this->frames[$f]->height * 4, SEEK_CUR); 155 | } 156 | } 157 | 158 | 159 | /** 160 | * Decode RLE 161 | */ 162 | private function RLE_decode( &$frame ) 163 | { 164 | $frame->type = Sprite::TYPE_INDEXED; 165 | $index = 0; 166 | $data = $frame->data; 167 | $size = $frame->size; 168 | $tmp = ""; 169 | 170 | while ( $index < $size ) { 171 | 172 | $c = $data[ $index++ ]; 173 | $tmp .= $c; 174 | 175 | if ( $c === "\x0" ) { 176 | $count = $data[$index++]; 177 | if ( $count === "\x0" ) 178 | $tmp .= $count; 179 | else 180 | $tmp .= str_repeat( $c, ord($count)-1 ); 181 | } 182 | } 183 | 184 | $frame->data = $tmp; 185 | } 186 | 187 | 188 | /** 189 | * Helper for rgba image (don't allocate more than needed) 190 | */ 191 | private function getColor( $img, $r, $g, $b, $a ) { 192 | $color = imagecolorexactalpha($img, $r, $g, $b, $a ); 193 | if ( $color !== -1 ) 194 | return $color; 195 | return imagecolorallocatealpha($img, $r, $g, $b, $a); 196 | } 197 | 198 | 199 | /** 200 | * Return an image 201 | */ 202 | public function getImage( $index, $is_mirror = 0, $mult_color = array(1.0,1.0,1.0), $bg_color = array(255,255,255,127) ) 203 | { 204 | $frame = $this->frames[$index]; 205 | $width = $frame->width; 206 | $height = $frame->height; 207 | $type = &$frame->type; 208 | $data = &$frame->data; 209 | 210 | 211 | // Parse frame data 212 | if( !strlen($data) ) { 213 | fseek( $this->fp, $frame->offset, SEEK_SET ); 214 | 215 | switch( $type ) { 216 | case Sprite::TYPE_INDEXED: 217 | $data = fread($this->fp, $width * $height ); 218 | break; 219 | 220 | case Sprite::TYPE_INDEXED_RLE: 221 | $data = fread($this->fp, $frame->size ); 222 | $this->RLE_decode( $frame ); 223 | break; 224 | 225 | case Sprite::TYPE_RGBA: 226 | $data = fread($this->fp, $width * $height * 4 ); 227 | break; 228 | } 229 | } 230 | 231 | 232 | // If palette. 233 | if ( $type === Sprite::TYPE_INDEXED ) { 234 | 235 | $img = imagecreate( $width, $height ); 236 | 237 | // Allocate palette 238 | $palette = unpack('C1024', $this->palette); 239 | for ( $i=0, $j=1, $pal=array(); $j<1024; ++$i, $j+=4 ) { 240 | $pal[chr($i)] = imagecolorallocate( 241 | $img, 242 | // Apply color mult 243 | $palette[$j+0] * $mult_color[0], 244 | $palette[$j+1] * $mult_color[1], 245 | $palette[$j+2] * $mult_color[2] 246 | ); 247 | } 248 | 249 | // Build image 250 | if ( $is_mirror ) { 251 | for ( $y=0, $i=0; $y<$height; $y++ ) { 252 | for( $x=$width-1; $x>-1; $x--, $i++ ) { 253 | if( $data[$i] !== "\x0" ) 254 | imagesetpixel( $img, $x, $y, $pal[ $data[$i] ]); 255 | } 256 | } 257 | } 258 | else { 259 | for ( $y=0, $i=0; $y<$height; $y++ ) { 260 | for( $x=0; $x<$width; $x++, $i++ ) { 261 | if( $data[$i] !== "\x0" ) 262 | imagesetpixel( $img, $x, $y, $pal[ $data[$i] ]); 263 | } 264 | } 265 | } 266 | // Replace white with a hacked white 267 | $index = imagecolorexact( $img, $bg_color[0], $bg_color[1], $bg_color[2] ); 268 | if ( $index > -1 ) 269 | imagecolorset( $img, $index, $bg_color[0], ( $bg_color[1] >= 255 ? $bg_color[1] - 1 : $bg_color[1] + 1 ), $bg_color[2] ); 270 | 271 | // Set white as transparent 272 | imagecolorset( $img, 0 , $bg_color[0], $bg_color[1], $bg_color[2] ); 273 | imagecolortransparent( $img, 0 ); 274 | } 275 | 276 | // RGBA Images 277 | // TODO: Buggy RGBA image (lol PHP GD lol...) 278 | else { 279 | $img = imagecreatetruecolor( $width, $height ); 280 | $white = imagecolorallocatealpha( $img, $bg_color[0], $bg_color[1], $bg_color[2], $bg_color[3] ); 281 | imagefill( $img, 0, 0, $white ); 282 | imagecolortransparent( $img, $white ); 283 | 284 | $pixels = unpack('C'. strlen($data), $data); 285 | if ( $is_mirror ) { 286 | for ( $y=$height-1, $i=1; $y>-1; $y-- ) { 287 | for( $x=$width-1; $x>-1; $x--, $i+=4 ) { 288 | if( $pixels[$i+0] > 0 ) { 289 | imagesetpixel( $img, $x, $y, $this->getColor( 290 | $img, 291 | $pixels[$i+3] * $mult_color[0], 292 | $pixels[$i+2] * $mult_color[1], 293 | $pixels[$i+1] * $mult_color[2], 294 | 127 - $pixels[$i+0]/2 295 | )); 296 | } 297 | } 298 | } 299 | } 300 | else { 301 | for ( $y=$height-1, $i=1; $y>-1; $y-- ) { 302 | for( $x=0; $x<$width; $x++, $i+=4 ) { 303 | if( $pixels[$i+0] > 0 ) { 304 | imagesetpixel( $img, $x, $y, $this->getColor( 305 | $img, 306 | $pixels[$i+3] * $mult_color[0], 307 | $pixels[$i+2] * $mult_color[1], 308 | $pixels[$i+1] * $mult_color[2], 309 | 127 - $pixels[$i+0]/2 310 | )); 311 | } 312 | } 313 | } 314 | } 315 | } 316 | 317 | 318 | // Return the result 319 | return $img; 320 | } 321 | } 322 | 323 | -------------------------------------------------------------------------------- /client/lua files/spreditinfo/2dlayerdir_f.lua: -------------------------------------------------------------------------------- 1 | SEX_FEMALE = 0 2 | SEX_MALE = 1 3 | LAYER_BIG = 0 4 | LAYER_SMALL = 1 5 | LayerSizeTypeList = { 6 | [SPRITE_ROBE_IDs.ROBE_WINGS] = LAYER_BIG, 7 | [SPRITE_ROBE_IDs.ROBE_BAG_OF_ADVENTURER] = LAYER_SMALL, 8 | [SPRITE_ROBE_IDs.ROBE_WINGS_OF_FALLEN_ANGEL] = LAYER_BIG, 9 | } 10 | SPRITE_INHERIT_LIST = { 11 | [JOBID.JT_NOVICE_H] = JOBID.JT_NOVICE, 12 | [JOBID.JT_SWORDMAN_H] = JOBID.JT_SWORDMAN, 13 | [JOBID.JT_MAGICIAN_H] = JOBID.JT_MAGICIAN, 14 | [JOBID.JT_MERCHANT_H] = JOBID.JT_MERCHANT, 15 | [JOBID.JT_ARCHER_H] = JOBID.JT_ARCHER, 16 | [JOBID.JT_ACOLYTE_H] = JOBID.JT_ACOLYTE, 17 | [JOBID.JT_THIEF_H] = JOBID.JT_THIEF, 18 | [JOBID.JT_SUPERNOVICE2] = JOBID.JT_SUPERNOVICE, 19 | [JOBID.JT_NOVICE_B] = JOBID.JT_NOVICE, 20 | [JOBID.JT_SWORDMAN_B] = JOBID.JT_SWORDMAN, 21 | [JOBID.JT_MAGICIAN_B] = JOBID.JT_MAGICIAN, 22 | [JOBID.JT_ARCHER_B] = JOBID.JT_ARCHER, 23 | [JOBID.JT_ACOLYTE_B] = JOBID.JT_ACOLYTE, 24 | [JOBID.JT_MERCHANT_B] = JOBID.JT_MERCHANT, 25 | [JOBID.JT_THIEF_B] = JOBID.JT_THIEF, 26 | [JOBID.JT_KNIGHT_B] = JOBID.JT_KNIGHT, 27 | [JOBID.JT_PRIEST_B] = JOBID.JT_PRIEST, 28 | [JOBID.JT_WIZARD_B] = JOBID.JT_WIZARD, 29 | [JOBID.JT_BLACKSMITH_B] = JOBID.JT_BLACKSMITH, 30 | [JOBID.JT_HUNTER_B] = JOBID.JT_HUNTER, 31 | [JOBID.JT_ASSASSIN_B] = JOBID.JT_ASSASSIN, 32 | [JOBID.JT_CRUSADER_B] = JOBID.JT_CRUSADER, 33 | [JOBID.JT_MONK_B] = JOBID.JT_MONK, 34 | [JOBID.JT_SAGE_B] = JOBID.JT_SAGE, 35 | [JOBID.JT_ROGUE_B] = JOBID.JT_ROGUE, 36 | [JOBID.JT_ALCHEMIST_B] = JOBID.JT_ALCHEMIST, 37 | [JOBID.JT_BARD_B] = JOBID.JT_BARD, 38 | [JOBID.JT_DANCER_B] = JOBID.JT_DANCER, 39 | [JOBID.JT_SUPERNOVICE_B] = JOBID.JT_SUPERNOVICE, 40 | [JOBID.JT_RUNE_KNIGHT_B] = JOBID.JT_RUNE_KNIGHT, 41 | [JOBID.JT_WARLOCK_B] = JOBID.JT_WARLOCK, 42 | [JOBID.JT_RANGER_B] = JOBID.JT_RANGER, 43 | [JOBID.JT_ARCHBISHOP_B] = JOBID.JT_ARCHBISHOP, 44 | [JOBID.JT_MECHANIC_B] = JOBID.JT_MECHANIC, 45 | [JOBID.JT_GUILLOTINE_CROSS_B] = JOBID.JT_GUILLOTINE_CROSS, 46 | [JOBID.JT_ROYAL_GUARD_B] = JOBID.JT_ROYAL_GUARD, 47 | [JOBID.JT_SORCERER_B] = JOBID.JT_SORCERER, 48 | [JOBID.JT_MINSTREL_B] = JOBID.JT_MINSTREL, 49 | [JOBID.JT_WANDERER_B] = JOBID.JT_WANDERER, 50 | [JOBID.JT_SURA_B] = JOBID.JT_SURA, 51 | [JOBID.JT_GENETIC_B] = JOBID.JT_GENETIC, 52 | [JOBID.JT_SHADOW_CHASER_B] = JOBID.JT_SHADOW_CHASER, 53 | [JOBID.JT_SUPERNOVICE2_B] = JOBID.JT_SUPERNOVICE2, 54 | } 55 | EXCEPTION_SPRITE_INHERIT_LIST = { 56 | [JOBID.JT_GUILLOTINE_CROSS] = JOBID.JT_ASSASSIN, 57 | [JOBID.JT_ALCHEMIST_H] = JOBID.JT_ALCHEMIST, 58 | [JOBID.JT_GENETIC] = JOBID.JT_ALCHEMIST, 59 | [JOBID.JT_DANCER_H] = JOBID.JT_DANCER, 60 | [JOBID.JT_WANDERER] = JOBID.JT_DANCER, 61 | [JOBID.JT_BARD_H] = JOBID.JT_BARD, 62 | [JOBID.JT_MINSTREL] = JOBID.JT_BARD, 63 | [JOBID.JT_MONK_H] = JOBID.JT_MONK, 64 | [JOBID.JT_SURA] = JOBID.JT_MONK, 65 | [JOBID.JT_ROGUE_H] = JOBID.JT_ROGUE, 66 | [JOBID.JT_SHADOW_CHASER] = JOBID.JT_ROGUE, 67 | [JOBID.JT_KNIGHT_H] = JOBID.JT_KNIGHT, 68 | [JOBID.JT_ARCHBISHOP] = JOBID.JT_PRIEST, 69 | [JOBID.JT_PECO_GUNNER] = JOBID.JT_PECO_SWORD, 70 | [JOBID.JT_CRUSADER_H] = JOBID.JT_CRUSADER, 71 | [JOBID.JT_MECHANIC] = JOBID.JT_BLACKSMITH, 72 | [JOBID.JT_WIZARD_H] = JOBID.JT_WIZARD, 73 | [JOBID.JT_WARLOCK] = JOBID.JT_WIZARD, 74 | } 75 | RIDING_SPRITE_INHERIT_LIST = { 76 | [JOBID.JT_PIG_WHITESMITH] = JOBID.JT_PIG_MERCHANT, 77 | [JOBID.JT_PIG_GENETIC] = JOBID.JT_PIG_MERCHANT, 78 | [JOBID.JT_PIG_CREATOR] = JOBID.JT_PIG_MERCHANT, 79 | [JOBID.JT_PIG_ALCHE] = JOBID.JT_PIG_MERCHANT, 80 | [JOBID.JT_PIG_BLACKSMITH] = JOBID.JT_PIG_MERCHANT, 81 | [JOBID.JT_PIG_MERCHANT_B] = JOBID.JT_PIG_MERCHANT, 82 | [JOBID.JT_PIG_GENETIC_B] = JOBID.JT_PIG_MERCHANT, 83 | [JOBID.JT_PIG_ALCHE_B] = JOBID.JT_PIG_MERCHANT, 84 | [JOBID.JT_PIG_MERCHANT_H] = JOBID.JT_PIG_MERCHANT, 85 | [JOBID.JT_PIG_BLACKSMITH_B] = JOBID.JT_PIG_MERCHANT, 86 | [JOBID.JT_SHEEP_ACO] = JOBID.JT_SHEEP_MONK, 87 | [JOBID.JT_SHEEP_SURA] = JOBID.JT_SHEEP_MONK, 88 | [JOBID.JT_SHEEP_ARCB] = JOBID.JT_SHEEP_MONK, 89 | [JOBID.JT_SHEEP_CHAMP] = JOBID.JT_SHEEP_MONK, 90 | [JOBID.JT_SHEEP_PRIEST] = JOBID.JT_SHEEP_MONK, 91 | [JOBID.JT_SHEEP_HPRIEST] = JOBID.JT_SHEEP_MONK, 92 | [JOBID.JT_SHEEP_ACO_B] = JOBID.JT_SHEEP_MONK, 93 | [JOBID.JT_SHEEP_MONK_B] = JOBID.JT_SHEEP_MONK, 94 | [JOBID.JT_SHEEP_ARCB_B] = JOBID.JT_SHEEP_MONK, 95 | [JOBID.JT_SHEEP_SURA_B] = JOBID.JT_SHEEP_MONK, 96 | [JOBID.JT_SHEEP_ACO_H] = JOBID.JT_SHEEP_MONK, 97 | [JOBID.JT_SHEEP_PRIEST_B] = JOBID.JT_SHEEP_MONK, 98 | [JOBID.JT_DOG_G_CROSS] = JOBID.JT_DOG_THIEF, 99 | [JOBID.JT_DOG_ROGUE] = JOBID.JT_DOG_THIEF, 100 | [JOBID.JT_DOG_CHASER] = JOBID.JT_DOG_THIEF, 101 | [JOBID.JT_DOG_STALKER] = JOBID.JT_DOG_THIEF, 102 | [JOBID.JT_DOG_ASSASSIN] = JOBID.JT_DOG_THIEF, 103 | [JOBID.JT_DOG_ASSA_X] = JOBID.JT_DOG_THIEF, 104 | [JOBID.JT_DOG_ASSASSIN_B] = JOBID.JT_DOG_THIEF, 105 | [JOBID.JT_DOG_ROGUE_B] = JOBID.JT_DOG_THIEF, 106 | [JOBID.JT_DOG_G_CROSS_B] = JOBID.JT_DOG_THIEF, 107 | [JOBID.JT_DOG_CHASER_B] = JOBID.JT_DOG_THIEF, 108 | [JOBID.JT_DOG_THIEF_H] = JOBID.JT_DOG_THIEF, 109 | [JOBID.JT_DOG_THIEF_B] = JOBID.JT_DOG_THIEF, 110 | [JOBID.JT_OSTRICH_DANCER] = JOBID.JT_OSTRICH_ARCHER, 111 | [JOBID.JT_OSTRICH_MINSTREL] = JOBID.JT_OSTRICH_ARCHER, 112 | [JOBID.JT_OSTRICH_BARD] = JOBID.JT_OSTRICH_ARCHER, 113 | [JOBID.JT_OSTRICH_SNIPER] = JOBID.JT_OSTRICH_ARCHER, 114 | [JOBID.JT_OSTRICH_WANDER] = JOBID.JT_OSTRICH_ARCHER, 115 | [JOBID.JT_OSTRICH_ZIPSI] = JOBID.JT_OSTRICH_ARCHER, 116 | [JOBID.JT_OSTRICH_CROWN] = JOBID.JT_OSTRICH_ARCHER, 117 | [JOBID.JT_OSTRICH_HUNTER] = JOBID.JT_OSTRICH_ARCHER, 118 | [JOBID.JT_OSTRICH_ARCHER_B] = JOBID.JT_OSTRICH_ARCHER, 119 | [JOBID.JT_OSTRICH_HUNTER_B] = JOBID.JT_OSTRICH_ARCHER, 120 | [JOBID.JT_OSTRICH_BARD_B] = JOBID.JT_OSTRICH_ARCHER, 121 | [JOBID.JT_OSTRICH_DANCER_B] = JOBID.JT_OSTRICH_ARCHER, 122 | [JOBID.JT_OSTRICH_MINSTREL_B] = JOBID.JT_OSTRICH_ARCHER, 123 | [JOBID.JT_OSTRICH_WANDER_B] = JOBID.JT_OSTRICH_ARCHER, 124 | [JOBID.JT_OSTRICH_ARCHER_H] = JOBID.JT_OSTRICH_ARCHER, 125 | [JOBID.JT_FOX_SAGE] = JOBID.JT_FOX_MAGICIAN, 126 | [JOBID.JT_FOX_SORCERER] = JOBID.JT_FOX_MAGICIAN, 127 | [JOBID.JT_FOX_WARLOCK] = JOBID.JT_FOX_MAGICIAN, 128 | [JOBID.JT_FOX_WIZ] = JOBID.JT_FOX_MAGICIAN, 129 | [JOBID.JT_FOX_HWIZ] = JOBID.JT_FOX_MAGICIAN, 130 | [JOBID.JT_FOX_MAGICIAN_B] = JOBID.JT_FOX_MAGICIAN, 131 | [JOBID.JT_FOX_SAGE_B] = JOBID.JT_FOX_MAGICIAN, 132 | [JOBID.JT_FOX_WARLOCK_B] = JOBID.JT_FOX_MAGICIAN, 133 | [JOBID.JT_FOX_SORCERER_B] = JOBID.JT_FOX_MAGICIAN, 134 | [JOBID.JT_FOX_MAGICIAN_H] = JOBID.JT_FOX_MAGICIAN, 135 | [JOBID.JT_FOX_WIZ_B] = JOBID.JT_FOX_MAGICIAN, 136 | [JOBID.JT_PORING_STAR] = JOBID.JT_PORING_NOVICE, 137 | [JOBID.JT_PORING_SNOVICE] = JOBID.JT_PORING_NOVICE, 138 | [JOBID.JT_PORING_TAEKWON] = JOBID.JT_PORING_NOVICE, 139 | [JOBID.JT_PORING_NOVICE_B] = JOBID.JT_PORING_NOVICE, 140 | [JOBID.JT_PORING_SNOVICE_B] = JOBID.JT_PORING_NOVICE, 141 | [JOBID.JT_PORING_NOVICE_H] = JOBID.JT_PORING_NOVICE, 142 | [JOBID.JT_PORING_SNOVICE2] = JOBID.JT_PORING_NOVICE, 143 | [JOBID.JT_PORING_SNOVICE2_B] = JOBID.JT_PORING_NOVICE, 144 | [JOBID.JT_FROG_KAGEROU] = JOBID.JT_FROG_NINJA, 145 | [JOBID.JT_FROG_OBORO] = JOBID.JT_FROG_NINJA, 146 | } 147 | 148 | --Function #0 149 | GetLayerSizeType = function(robeID) 150 | if LayerSizeTypeList[robeID] == nil then 151 | return LAYER_BIG 152 | end 153 | local sizeType = LayerSizeTypeList[robeID] 154 | if sizeType ~= nil then 155 | return sizeType 156 | else 157 | return LAYER_BIG 158 | end 159 | end 160 | 161 | --Function #1 162 | GetLayerDirTbl = function(sex, robeID) 163 | local sizeType = GetLayerSizeType(robeID) 164 | if sizeType == LAYER_BIG then 165 | if sex == SEX_FEMALE then 166 | return BigLayerDir_F 167 | else 168 | return BigLayerDir_M 169 | end 170 | elseif sizeType == LAYER_SMALL then 171 | if sex == SEX_FEMALE then 172 | return SmallLayerDir_F 173 | else 174 | return SmallLayerDir_M 175 | end 176 | end 177 | end 178 | 179 | --Function #2 180 | GetSpriteInheriteJob = function(jobID) 181 | if RIDING_SPRITE_INHERIT_LIST ~= nil and RIDING_SPRITE_INHERIT_LIST[jobID] ~= nil then 182 | jobID = RIDING_SPRITE_INHERIT_LIST[jobID] 183 | end 184 | if JOB_INHERIT_LIST2 ~= nil and JOB_INHERIT_LIST2[jobID] ~= nil then 185 | jobID = JOB_INHERIT_LIST2[jobID] 186 | end 187 | if SPRITE_INHERIT_LIST ~= nil and SPRITE_INHERIT_LIST[jobID] ~= nil then 188 | jobID = SPRITE_INHERIT_LIST[jobID] 189 | end 190 | local sizeType = GetLayerSizeType(robeID) 191 | if sizeType == LAYER_BIG then 192 | if EXCEPTION_SPRITE_INHERIT_LIST ~= nil and EXCEPTION_SPRITE_INHERIT_LIST[jobID] ~= nil then 193 | jobID = EXCEPTION_SPRITE_INHERIT_LIST[jobID] 194 | end 195 | end 196 | return jobID 197 | end 198 | 199 | --Function #3 200 | DrawOnTop = function(robeID, sex, jobID, actNum, motNum) 201 | local LayerDirTbl = GetLayerDirTbl(sex, robeID) 202 | jobID = GetSpriteInheriteJob(jobID) 203 | if LayerDirTbl == nil or LayerDirTbl[jobID] == nil then 204 | return true 205 | end 206 | if LayerDirTbl[jobID][actNum] == nil then 207 | return true 208 | end 209 | local idx = 1 210 | motInfo = LayerDirTbl[jobID][actNum][idx] 211 | while motInfo ~= nil do 212 | if motInfo == motNum then 213 | return false 214 | end 215 | idx = idx +1 216 | motInfo = LayerDirTbl[jobID][actNum][idx] 217 | end 218 | return true 219 | end -------------------------------------------------------------------------------- /render/class.RORender.php: -------------------------------------------------------------------------------- 1 | param[$name]) ) 80 | { 81 | $this->param[$name] = $value; 82 | } 83 | } 84 | 85 | 86 | /** 87 | * Creating Image 88 | */ 89 | protected function createImage( $width=0, $height=0 ) 90 | { 91 | // Default value 92 | if( empty($width) && empty($height) ) { 93 | $width = $this->image_size[0]; 94 | $height = $this->image_size[1]; 95 | } 96 | 97 | // Create Image 98 | $img = imagecreatetruecolor( $width, $height ); 99 | imagealphablending( $img, false); 100 | imagesavealpha( $img, true); 101 | 102 | // Set on the background 103 | $transparent = imagecolorallocatealpha( 104 | $img, 105 | self::$background_color[0], 106 | self::$background_color[1], 107 | self::$background_color[2], 108 | self::$background_color[3] 109 | ); 110 | 111 | imagefill( $img, 0, 0, $transparent ); 112 | imagecolortransparent( $img, $transparent ); 113 | 114 | return $img; 115 | } 116 | 117 | 118 | /** 119 | * Render an image 120 | */ 121 | final protected function renderImage( &$img, $param ) 122 | { 123 | $file_spr = false; 124 | $file_act = false; 125 | 126 | // Nothing to render... 127 | if( isset($param['scale']) ) { 128 | if( $param['scale'] == 0 ) { 129 | return; 130 | } 131 | } 132 | 133 | // Use the same path 134 | if ( !empty($param['path']) ) 135 | { 136 | $file_spr = Client::getFile( $param['path'] . '.spr' ); 137 | $file_act = Client::getFile( $param['path'] . '.act' ); 138 | } 139 | 140 | // Use different act file (pet accessory for example) 141 | else if ( !empty($param['spr']) && !empty($param['act']) ) 142 | { 143 | if( $param['act'] === '.act' || $param['spr'] === '.spr' ) 144 | return; 145 | 146 | $file_spr = Client::getFile( $param['spr'] ); 147 | $file_act = Client::getFile( $param['act'] ); 148 | 149 | // Act file not found, search for the act file near .spr ? 150 | if ( $file_act === false ) 151 | $file_act = Client::getFile( current( explode('.spr', $param['spr']) ) . '.act' ); 152 | } 153 | 154 | // Don't render if there is nothing to render (file not found or not defined) 155 | if ( $file_spr === false || $file_act === false ) 156 | return; 157 | 158 | // Always render on top (except for robe on some case) 159 | $render_onTop = true; 160 | 161 | // Calculate action and animation 162 | $action = ( 163 | max( 0, $this->action * 8) + 164 | max( 0, $this->direction ) % 8 165 | ); 166 | 167 | // Doridori mod only with some conditions 168 | if ( 169 | get_class($this) === 'CharacterHeadRender' || // Only head 170 | ( 171 | get_class($this) === 'CharacterRender' && // Only for character 172 | !empty($param['head']) && // Only for head 173 | ( $this->action === CharacterRender::ACTION_IDLE || // Only when sit or stand 174 | $this->action === CharacterRender::ACTION_SIT ) 175 | ) 176 | ) { 177 | $doridori = $this->doridori % 3; 178 | $anim = 0; 179 | } 180 | 181 | // Basique 182 | else 183 | { 184 | // All animations are link to the body animation 185 | // If we update it, we have to update others. 186 | if( !empty($param['body']) ) { 187 | $anim = &$this->body_animation; 188 | 189 | // Durty trick with doridori on body. 190 | if( get_class($this) === 'CharacterRender' && 191 | ($this->action === CharacterRender::ACTION_IDLE || 192 | $this->action === CharacterRender::ACTION_SIT ) 193 | ) { 194 | $this->doridori %= 3; 195 | $anim = $this->doridori; 196 | } 197 | } 198 | else { 199 | $anim = $this->body_animation; 200 | } 201 | 202 | $doridori = -1; 203 | } 204 | 205 | 206 | // Load spr and act 207 | $spr = new Sprite( $file_spr ); 208 | $act = new Action( $file_act ); 209 | $animation = $act->getAnimation($action, $anim, $doridori); 210 | 211 | 212 | // If have palette, load it 213 | if ( !empty($param['pal']) ) 214 | { 215 | if ( $file_pal = Client::getFile($param['pal']) ) 216 | $spr->palette = file_get_contents($file_pal); 217 | } 218 | 219 | $pos = $animation->pos[0]; 220 | $reference = isset($param['pos']) ? $param['pos'] : $pos; 221 | 222 | // Robe can be display behind the character some times 223 | if ( isset($param['robe']) ) 224 | { 225 | $render_onTop = DB::robe_ontop( $this->param['class'], $this->param['sex'], $param['robe'], $action, $anim ); 226 | } 227 | 228 | 229 | // Hardcod shield zIndex feature 230 | else if ( isset($param['shield']) ) 231 | { 232 | $direction = max( 0, $this->direction % 8 ); 233 | $render_onTop = ( 234 | $direction !== self::DIRECTION_NORTHWEST && 235 | $direction !== self::DIRECTION_NORTHEAST && 236 | $direction !== self::DIRECTION_NORTH 237 | ); 238 | } 239 | 240 | // Robe zIndex 241 | if ( !$render_onTop ) 242 | { 243 | $_img = $img; 244 | $img = $this->createImage(); 245 | } 246 | 247 | 248 | // Draw all layers 249 | foreach( $animation->layers as $layer ) 250 | { 251 | // Avoid rendering empty images 252 | if ( $layer->index > -1 ) 253 | { 254 | // RGBA image is after pal image 255 | $index = $layer->index; 256 | if ( $layer->spr_type === Sprite::TYPE_RGBA ) 257 | $index += $spr->rgba_index; 258 | 259 | 260 | // Build sprite image 261 | $image = $spr->getImage( $index, $layer->is_mirror, $layer->color, self::$background_color ); 262 | 263 | $width = imagesx($image); 264 | $height = imagesy($image); 265 | $scale = $layer->scale; 266 | 267 | // Main scale feature 268 | if( isset($param['scale']) ) { 269 | $scale[0] *= $param['scale']; 270 | $scale[1] *= $param['scale']; 271 | } 272 | 273 | // Generate scale 274 | if ( $scale[0] !== 1.0 && $scale[1] !== 1.0 ) 275 | { 276 | // New size 277 | $w = $width * $scale[0]; 278 | $h = $height * $scale[1]; 279 | 280 | // Copy image to new layer (resize) 281 | $tmp = $this->createImage($w, $h); 282 | imagecopyresampled( $tmp, $image, 0, 0, 0, 0, $w, $h, $width, $height ); 283 | imagedestroy( $image ); 284 | 285 | $image = $tmp; 286 | $width = $w; 287 | $height = $h; 288 | } 289 | 290 | // Convert palette to true color 291 | else if ( !imageistruecolor($image) ) 292 | { 293 | $tmp = $this->createImage($width, $height); 294 | imagecopy( $tmp, $image, 0, 0, 0, 0, $width, $height ); 295 | imagedestroy( $image ); 296 | 297 | $image = $tmp; 298 | } 299 | 300 | // Apply a rotation 301 | if ( !empty($layer->angle) ) 302 | { 303 | $image = imagerotate( $image, -$layer->angle, imagecolortransparent($image), 1 ); 304 | $width = imagesx($image); 305 | $height = imagesy($image); 306 | } 307 | 308 | // Calculate the position 309 | $x = $this->dot_reference[0] - $width /2 + $layer->pos[0] + $reference->x - intval( $pos->x ); 310 | $y = $this->dot_reference[1] - $height/2 + $layer->pos[1] + $reference->y - intval( $pos->y ); 311 | 312 | // Copy image to main layer 313 | imagecopymerge( 314 | $img, 315 | $image, 316 | $x, $y, 317 | 0, 0, 318 | $width, $height, 319 | $layer->color[3] * 100 320 | ); 321 | 322 | imagedestroy($image); 323 | } 324 | } 325 | 326 | 327 | // Robe/shield ontop 328 | if ( !$render_onTop ) 329 | { 330 | imagecopy( 331 | $img, 332 | $_img, 0, 0, 0, 0, 333 | $this->image_size[0], 334 | $this->image_size[1] 335 | ); 336 | } 337 | 338 | // Return its pos for reference 339 | return $pos; 340 | } 341 | } 342 | 343 | -------------------------------------------------------------------------------- /loaders/class.Action.php: -------------------------------------------------------------------------------- 1 | open($filename); 24 | } 25 | 26 | 27 | /** 28 | * Open a Action file 29 | * Do some check before. 30 | */ 31 | public function open($filename) 32 | { 33 | if ( substr( $filename, 0, 7 ) !== "data://" ) 34 | { 35 | if ( ! file_exists($filename) ) 36 | throw new Exception("ACT::open() - Can't find file '{$filename}'."); 37 | 38 | if ( ! is_readable($filename) ) 39 | throw new Exception("ACT::open() - Can't read file '{$filename}'."); 40 | 41 | $this->size = filesize($filename); 42 | 43 | if ( $this->size < 0x08 ) 44 | throw new Exception("ACT::open() - Incorrect file size, shoulnot be a ACT file"); 45 | } 46 | 47 | $this->fp = fopen($filename,'r'); 48 | 49 | extract( unpack( "a2head/C2ver", fread($this->fp, 0x4 ) ) ); 50 | 51 | if ( $head !== 'AC' ) 52 | throw new Exception("ACT::load() - Incorrect act header, is '{$head}' - should be 'AC'"); 53 | 54 | $this->version = $ver1/10 + $ver2; 55 | //$this->load(); 56 | } 57 | 58 | 59 | /** 60 | * Adding exclusively for the chargen to spee up the process. 61 | */ 62 | public function getAnimation($action, &$animation, $doridori=-1) { 63 | // Skip header 64 | fseek( $this->fp, 0x4, SEEK_SET); 65 | 66 | // Pre-calculate layer size 67 | if( $this->version < 2.0 ) $layer_size = 16; 68 | else if( $this->version < 2.4 ) $layer_size = 32; 69 | else if( $this->version === 2.4 ) $layer_size = 36; 70 | else $layer_size = 44; 71 | 72 | 73 | // read actions 74 | extract( unpack("vaction_count/x10", fread( $this->fp, 12 ) ) ); 75 | 76 | $action %= $action_count; 77 | 78 | for ( $i=0; $i<$action_count; ++$i ) { 79 | 80 | // read animation 81 | extract( unpack("Vanimation_count", fread( $this->fp, 0x04 ) ) ); 82 | 83 | if( $i === $action ) { 84 | 85 | // doridori feature 86 | if( $doridori > -1 ) { 87 | $animation = floor( $animation_count / 3 ) * $doridori; 88 | } 89 | 90 | // Cap 91 | $animation = min( $animation, $animation_count - 1 ); 92 | $animation = max( $animation, 0 ); 93 | } 94 | 95 | for ( $j=0; $j<$animation_count; ++$j ) { 96 | fseek( $this->fp, 32, SEEK_CUR ); 97 | 98 | // End. 99 | if( $action == $i && $animation == $j ) 100 | return $this->readLayers(); 101 | 102 | // read layers 103 | extract( unpack("Vlayer_count", fread( $this->fp, 0x04 ) ) ); 104 | fseek( $this->fp, $layer_size * $layer_count, SEEK_CUR); 105 | 106 | if ( $this->version >= 2.0 ) 107 | fseek( $this->fp, 0x04, SEEK_CUR); 108 | 109 | if ( $this->version >= 2.3 ) { 110 | extract( unpack("Vpos_count", fread($this->fp,0x04) ) ); 111 | fseek( $this->fp, $pos_count * 16, SEEK_CUR); 112 | } 113 | } 114 | } 115 | 116 | throw new Exception('Action not found ?'); 117 | } 118 | 119 | 120 | /** 121 | * Load an Action file 122 | */ 123 | public function load() 124 | { 125 | $this->readActions(); 126 | 127 | if ( $this->version >= 2.1 ) { 128 | 129 | // Sound 130 | extract( unpack("Vcount", fread( $this->fp, 0x04 ) ) ); 131 | for ( $i=0; $i<$count; ++$i ) 132 | $this->sounds[$i] = current( unpack('a40', fread( $this->fp, 40 ) ) ); 133 | 134 | // Delay 135 | if ( $this->version >= 2.2 ) 136 | foreach( $this->actions as &$action ) 137 | $action->delay = current( unpack("f", fread($this->fp, 0x04) ) ) * 25; 138 | } 139 | } 140 | 141 | 142 | /** 143 | * Load ACT actions 144 | */ 145 | private function readActions() 146 | { 147 | extract( unpack("vcount/x10", fread( $this->fp, 12 ) ) ); 148 | for ( $i=0; $i<$count; ++$i ) { 149 | $this->actions[$i] = (object) array( 150 | "animations" => $this->readAnimations(), 151 | "delay" => 150 152 | ); 153 | } 154 | } 155 | 156 | 157 | /** 158 | * Load ACT animations 159 | */ 160 | private function readAnimations() 161 | { 162 | extract( unpack("Vcount", fread( $this->fp, 0x04 ) ) ); 163 | $animations = array(); 164 | 165 | for ( $i=0; $i<$count; ++$i ) { 166 | fseek( $this->fp, 32, SEEK_CUR ); 167 | $animations[$i] = $this->readLayers(); 168 | } 169 | 170 | return $animations; 171 | } 172 | 173 | 174 | /** 175 | * Load ACT layers 176 | */ 177 | private function readLayers() 178 | { 179 | extract( unpack("Vcount", fread( $this->fp, 0x04 ) ) ); 180 | $layers = array(); 181 | 182 | 183 | if ( $this->version < 2.0 ) { 184 | $size = 0; 185 | $struct = ""; 186 | } 187 | 188 | else if ( $this->version < 2.4 ) { 189 | $size = 16; 190 | $struct = "C4color/f1scale/Vangle/Vspr_type"; 191 | } 192 | 193 | else if ( $this->version === 2.4 ) { 194 | $size = 20; 195 | $struct = "C4color/f2scale/Vangle/Vspr_type"; 196 | } 197 | 198 | else { 199 | $size = 28; 200 | $struct = "C4color/f2scale/Vangle/Vspr_type/Vwidth/Vheight"; 201 | } 202 | 203 | 204 | for ( $i=0; $i<$count; ++$i ) { 205 | $param = unpack( "Vx/Vy/lindex/Vis_mirror/" . $struct, fread($this->fp, $size + 16) ); 206 | $layers[$i] = (object) array( 207 | "pos" => array( $param['x'], $param['y'] ), 208 | "index" => $param['index'], 209 | "is_mirror" => $param['is_mirror'], 210 | "scale" => array( 1.0, 1.0 ), 211 | "color" => array( 255, 255, 255, 255 ), 212 | "angle" => 0, 213 | "spr_type" => 0, 214 | "width" => 0, 215 | "height" => 0 216 | ); 217 | $layer = &$layers[$i]; 218 | 219 | $layer->color[0] = $param['color1']/255; 220 | $layer->color[1] = $param['color2']/255; 221 | $layer->color[2] = $param['color3']/255; 222 | $layer->color[3] = $param['color4']/255; 223 | 224 | $layer->scale[0] = isset($param['scale1']) ? $param['scale1'] : 1.0; 225 | $layer->scale[1] = isset($param['scale2']) ? $param['scale2'] : $layer->scale[0]; 226 | 227 | if ( isset($param['angle']) ) $layer->angle = $param['angle']; 228 | if ( isset($param['spr_type']) ) $layer->spr_type = $param['spr_type']; 229 | if ( isset($param['width']) ) $layer->width = $param['width']; 230 | if ( isset($param['height']) ) $layer->height = $param['height']; 231 | } 232 | 233 | 234 | $sound = -1; 235 | if ( $this->version >= 2.0 ) 236 | extract( unpack("Vsound", fread($this->fp,0x04) ) ); 237 | 238 | 239 | $pos = array( (object) array('x' => 0, 'y' => 0) ); 240 | if ( $this->version >= 2.3 ) { 241 | extract( unpack("Vcount", fread($this->fp,0x04) ) ); 242 | for ( $i=0; $i<$count; ++$i ) { 243 | $pos[$i] = (object) unpack( "Vunk/Vx/Vy/Vattr", fread($this->fp,16) ); 244 | } 245 | } 246 | 247 | return (object) array( 248 | "layers" => $layers, 249 | "sound" => $sound, 250 | "pos" => $pos 251 | ); 252 | } 253 | 254 | 255 | 256 | /** 257 | * Compile an ACT file 258 | */ 259 | public function compile() 260 | { 261 | 262 | // Header 263 | $result = pack('a2C2', 'AC', $this->version * 10 % 10, floor($this->version * 10)/10 ); 264 | 265 | // Action count 266 | $result .= pack( 'vx10', count($this->actions) ); 267 | 268 | // Compile each actions 269 | foreach( $this->actions as $action ) 270 | { 271 | 272 | // Number of animations 273 | $result .= pack( 'V', count($action->animations) ); 274 | 275 | // Compile animations 276 | foreach( $action->animations as $animation ) 277 | { 278 | 279 | // 32 uknown offset + layers count 280 | $result .= pack( 'x32V', count($animation->layers) ); 281 | 282 | // Compile layers 283 | foreach( $animation->layers as $layer ) 284 | { 285 | $result .= pack('V4', $layer->pos[0], $layer->pos[1], $layer->index, $layer->is_mirror); 286 | 287 | if ( $this->version < 2.0 ) 288 | continue; 289 | 290 | else if ( $this->version < 2.4 ) 291 | $result .= pack( 292 | 'C4fV2', 293 | $layer->color[0]*255, 294 | $layer->color[1]*255, 295 | $layer->color[2]*255, 296 | $layer->color[3]*255, 297 | $layer->scale[0], 298 | $layer->angle, 299 | $layer->spr_type 300 | ); 301 | 302 | else if ( $this->version === 2.4 ) 303 | $result .= pack( 304 | 'C4f2V2', 305 | $layer->color[0]*255, 306 | $layer->color[1]*255, 307 | $layer->color[2]*255, 308 | $layer->color[3]*255, 309 | $layer->scale[0], 310 | $layer->scale[1], 311 | $layer->angle, 312 | $layer->spr_type 313 | ); 314 | 315 | else 316 | $result .= pack( 317 | 'C4f2V4', 318 | $layer->color[0]*255, 319 | $layer->color[1]*255, 320 | $layer->color[2]*255, 321 | $layer->color[3]*255, 322 | $layer->scale[0], 323 | $layer->scale[1], 324 | $layer->angle, 325 | $layer->spr_type, 326 | $layer->width, 327 | $layer->height 328 | ); 329 | } 330 | 331 | 332 | // Animation sound 333 | if ( $this->version >= 2.0 ) 334 | { 335 | $result .= pack('V', $animation->sound ); 336 | } 337 | 338 | // Animation imf (head pos) 339 | if ( $this->version >= 2.3 ) 340 | { 341 | $result .= pack('V', count($animation->pos) ); 342 | foreach( $animation->pos as $pos ) 343 | { 344 | $result .= pack( 'V4', $pos->unk, $pos->x, $pos->y, $pos->attr ); 345 | } 346 | } 347 | } 348 | } 349 | 350 | 351 | if ( $this->version >= 2.1 ) 352 | { 353 | // Comple sounds 354 | $result .= pack( 'V', count($this->sounds) ); 355 | foreach( $this->sounds as $sound ) 356 | { 357 | $result .= pack( 'a40', $sound ); 358 | } 359 | 360 | // Comple delay 361 | if ( $this->version >= 2.2 ) 362 | { 363 | foreach( $this->actions as $action ) 364 | { 365 | $result .= pack( 'f', $action->delay / 25 ); 366 | } 367 | } 368 | } 369 | 370 | return $result; 371 | } 372 | } 373 | 374 | -------------------------------------------------------------------------------- /client/lua files/skillinfoz/jobinheritlist.lua: -------------------------------------------------------------------------------- 1 | JOBID = { 2 | 3 | JT_NOVICE = 0, 4 | JT_SWORDMAN = 1, 5 | JT_MAGICIAN = 2, 6 | JT_ARCHER = 3, 7 | JT_ACOLYTE = 4, 8 | JT_MERCHANT = 5, 9 | JT_THIEF = 6, 10 | JT_KNIGHT = 7, 11 | JT_PRIEST = 8, 12 | JT_WIZARD = 9, 13 | JT_BLACKSMITH = 10, 14 | JT_HUNTER = 11, 15 | JT_ASSASSIN = 12, 16 | JT_CRUSADER = 14, 17 | JT_MONK = 15, 18 | JT_SAGE = 16, 19 | JT_ROGUE = 17, 20 | JT_ALCHEMIST = 18, 21 | JT_BARD = 19, 22 | JT_DANCER = 20, 23 | --21 Skipped 24 | JT_MARRIED = 22, 25 | JT_SUPERNOVICE = 23, 26 | JT_GUNSLINGER = 24, 27 | JT_NINJA = 25, 28 | --26 Skipped 29 | JT_SUMMER = 27, 30 | JT_NOVICE_H = 4001, 31 | JT_SWORDMAN_H = 4002, 32 | JT_MAGICIAN_H = 4003, 33 | JT_ARCHER_H = 4004, 34 | JT_ACOLYTE_H = 4005, 35 | JT_MERCHANT_H = 4006, 36 | JT_THIEF_H = 4007, 37 | JT_KNIGHT_H = 4008, 38 | JT_PRIEST_H = 4009, 39 | JT_WIZARD_H = 4010, 40 | JT_BLACKSMITH_H = 4011, 41 | JT_HUNTER_H = 4012, 42 | JT_ASSASSIN_H = 4013, 43 | JT_CRUSADER_H = 4015, 44 | JT_MONK_H = 4016, 45 | JT_SAGE_H = 4017, 46 | JT_ROGUE_H = 4018, 47 | JT_ALCHEMIST_H = 4019, 48 | JT_BARD_H = 4020, 49 | JT_DANCER_H = 4021, 50 | JT_NOVICE_B = 4023, 51 | JT_SWORDMAN_B = 4024, 52 | JT_MAGICIAN_B = 4025, 53 | JT_ARCHER_B = 4026, 54 | JT_ACOLYTE_B = 4027, 55 | JT_MERCHANT_B = 4028, 56 | JT_THIEF_B = 4029, 57 | JT_KNIGHT_B = 4030, 58 | JT_PRIEST_B = 4031, 59 | JT_WIZARD_B = 4032, 60 | JT_BLACKSMITH_B = 4033, 61 | JT_HUNTER_B = 4034, 62 | JT_ASSASSIN_B = 4035, 63 | JT_CRUSADER_B = 4037, 64 | JT_MONK_B = 4038, 65 | JT_SAGE_B = 4039, 66 | JT_ROGUE_B = 4040, 67 | JT_ALCHEMIST_B = 4041, 68 | JT_BARD_B = 4042, 69 | JT_DANCER_B = 4043, 70 | JT_SUPERNOVICE_B = 4045, 71 | JT_TAEKWON = 4046, 72 | JT_STAR = 4047, 73 | JT_STAR2 = 4048, 74 | JT_LINKER = 4049, 75 | JT_RUNE_KNIGHT = 4054, 76 | JT_WARLOCK = 4055, 77 | JT_RANGER = 4056, 78 | JT_ARCHBISHOP = 4057, 79 | JT_MECHANIC = 4058, 80 | JT_GUILLOTINE_CROSS = 4059, 81 | JT_RUNE_KNIGHT_H = 4060, 82 | JT_WARLOCK_H = 4061, 83 | JT_RANGER_H = 4062, 84 | JT_ARCHBISHOP_H = 4063, 85 | JT_MECHANIC_H = 4064, 86 | JT_GUILLOTINE_CROSS_H = 4065, 87 | JT_ROYAL_GUARD = 4066, 88 | JT_SORCERER = 4067, 89 | JT_MINSTREL = 4068, 90 | JT_WANDERER = 4069, 91 | JT_SURA = 4070, 92 | JT_GENETIC = 4071, 93 | JT_SHADOW_CHASER = 4072, 94 | JT_ROYAL_GUARD_H = 4073, 95 | JT_SORCERER_H = 4074, 96 | JT_MINSTREL_H = 4075, 97 | JT_WANDERER_H = 4076, 98 | JT_SURA_H = 4077, 99 | JT_GENETIC_H = 4078, 100 | JT_SHADOW_CHASER_H = 4079, 101 | JT_RUNE_KNIGHT_B = 4096, 102 | JT_WARLOCK_B = 4097, 103 | JT_RANGER_B = 4098, 104 | JT_ARCHBISHOP_B = 4099, 105 | JT_MECHANIC_B = 4100, 106 | JT_GUILLOTINE_CROSS_B = 4101, 107 | JT_ROYAL_GUARD_B = 4102, 108 | JT_SORCERER_B = 4103, 109 | JT_MINSTREL_B = 4104, 110 | JT_WANDERER_B = 4105, 111 | JT_SURA_B = 4106, 112 | JT_GENETIC_B = 4107, 113 | JT_SHADOW_CHASER_B = 4108, 114 | JT_SUPERNOVICE2 = 4190, 115 | JT_SUPERNOVICE2_B = 4191, 116 | JT_KAGEROU = 4211, 117 | JT_OBORO = 4212, 118 | JT_RUNE_CHICKEN = 4080, 119 | JT_ROYAL_CHICKEN = 4082, 120 | JT_WOLF_RANGER = 4084, 121 | JT_FROG_NINJA = 4114, 122 | JT_PECO_GUNNER = 4115, 123 | JT_PECO_SWORD = 4116, 124 | JT_CHICKEN = 13, 125 | JT_FROG_KAGEROU = 4213, 126 | JT_FROG_OBORO = 4214, 127 | JT_PIG_MERCHANT = 4119, 128 | JT_PIG_WHITESMITH = 4118, 129 | JT_PIG_GENETIC = 4120, 130 | JT_PIG_CREATOR = 4121, 131 | JT_PIG_ALCHE = 4137, 132 | JT_PIG_BLACKSMITH = 4138, 133 | JT_PIG_MERCHANT_B = 4163, 134 | JT_PIG_ALCHE_B = 4169, 135 | JT_PIG_GENETIC_B = 4180, 136 | JT_PIG_MERCHANT_H = 4188, 137 | JT_PIG_BLACKSMITH_B = 4196, 138 | JT_SHEEP_MONK = 4125, 139 | JT_SHEEP_ACO = 4126, 140 | JT_SHEEP_SURA = 4127, 141 | JT_SHEEP_ARCB = 4129, 142 | JT_SHEEP_CHAMP = 4139, 143 | JT_SHEEP_PRIEST = 4156, 144 | JT_SHEEP_HPRIEST = 4157, 145 | JT_SHEEP_ACO_B = 4162, 146 | JT_SHEEP_MONK_B = 4166, 147 | JT_SHEEP_ARCB_B = 4174, 148 | JT_SHEEP_SURA_B = 4179, 149 | JT_SHEEP_ACO_H = 4187, 150 | JT_SHEEP_PRIEST_B = 4194, 151 | JT_DOG_G_CROSS = 4140, 152 | JT_DOG_THIEF = 4141, 153 | JT_DOG_ROGUE = 4142, 154 | JT_DOG_CHASER = 4143, 155 | JT_DOG_STALKER = 4144, 156 | JT_DOG_ASSASSIN = 4145, 157 | JT_DOG_ASSA_X = 4146, 158 | JT_DOG_ASSASSIN_B = 4165, 159 | JT_DOG_ROGUE_B = 4168, 160 | JT_DOG_G_CROSS_B = 4175, 161 | JT_DOG_THIEF_B = 4181, 162 | JT_DOG_CHASER_B = 4182, 163 | JT_DOG_THIEF_H = 4189, 164 | JT_OSTRICH_ARCHER = 4122, 165 | JT_OSTRICH_DANCER = 4147, 166 | JT_OSTRICH_MINSTREL = 4148, 167 | JT_OSTRICH_BARD = 4149, 168 | JT_OSTRICH_SNIPER = 4150, 169 | JT_OSTRICH_WANDER = 4151, 170 | JT_OSTRICH_ZIPSI = 4152, 171 | JT_OSTRICH_CROWN = 4153, 172 | JT_OSTRICH_HUNTER = 4154, 173 | JT_OSTRICH_ARCHER_B = 4161, 174 | JT_OSTRICH_HUNTER_B = 4164, 175 | JT_OSTRICH_BARD_B = 4170, 176 | JT_OSTRICH_DANCER_B = 4171, 177 | JT_OSTRICH_MINSTREL_B = 4177, 178 | JT_OSTRICH_WANDER_B = 4178, 179 | JT_OSTRICH_ARCHER_H = 4186, 180 | JT_FOX_MAGICIAN = 4130, 181 | JT_FOX_SAGE = 4131, 182 | JT_FOX_SORCERER = 4132, 183 | JT_FOX_WARLOCK = 4133, 184 | JT_FOX_WIZ = 4134, 185 | JT_FOX_HWIZ = 4136, 186 | JT_FOX_MAGICIAN_B = 4160, 187 | JT_FOX_SAGE_B = 4167, 188 | JT_FOX_WARLOCK_B = 4173, 189 | JT_FOX_SORCERER_B = 7176, 190 | JT_FOX_MAGICIAN_H = 4185, 191 | JT_FOX_WIZ_B = 4195, 192 | JT_PORING_NOVICE = 4124, 193 | JT_PORING_STAR = 4123, 194 | JT_PORING_SNOVICE = 4128, 195 | JT_PORING_TAEKWON = 4155, 196 | JT_PORING_NOVICE_B = 4158, 197 | JT_PORING_SNOVICE_B = 4172, 198 | JT_PORING_NOVICE_H = 4183, 199 | JT_PORING_SNOVICE2 = 4192, 200 | JT_PORING_SNOVICE2_B = 4193, 201 | } 202 | 203 | JOB_INHERIT_LIST = { 204 | 205 | [JOBID.JT_SWORDMAN] = JOBID.JT_NOVICE, 206 | [JOBID.JT_MAGICIAN] = JOBID.JT_NOVICE, 207 | [JOBID.JT_ARCHER] = JOBID.JT_NOVICE, 208 | [JOBID.JT_ACOLYTE] = JOBID.JT_NOVICE, 209 | [JOBID.JT_MERCHANT] = JOBID.JT_NOVICE, 210 | [JOBID.JT_THIEF] = JOBID.JT_NOVICE, 211 | [JOBID.JT_KNIGHT] = JOBID.JT_SWORDMAN, 212 | [JOBID.JT_PRIEST] = JOBID.JT_ACOLYTE, 213 | [JOBID.JT_WIZARD] = JOBID.JT_MAGICIAN, 214 | [JOBID.JT_BLACKSMITH] = JOBID.JT_MERCHANT, 215 | [JOBID.JT_HUNTER] = JOBID.JT_ARCHER, 216 | [JOBID.JT_ASSASSIN] = JOBID.JT_THIEF, 217 | [JOBID.JT_CRUSADER] = JOBID.JT_SWORDMAN, 218 | [JOBID.JT_MONK] = JOBID.JT_ACOLYTE, 219 | [JOBID.JT_SAGE] = JOBID.JT_MAGICIAN, 220 | [JOBID.JT_ROGUE] = JOBID.JT_THIEF, 221 | [JOBID.JT_ALCHEMIST] = JOBID.JT_MERCHANT, 222 | [JOBID.JT_BARD] = JOBID.JT_ARCHER, 223 | [JOBID.JT_DANCER] = JOBID.JT_ARCHER, 224 | [JOBID.JT_SUPERNOVICE] = JOBID.JT_NOVICE, 225 | [JOBID.JT_GUNSLINGER] = JOBID.JT_NOVICE, 226 | [JOBID.JT_NINJA] = JOBID.JT_NOVICE, 227 | [JOBID.JT_NOVICE_H] = JOBID.JT_NOVICE, 228 | [JOBID.JT_SWORDMAN_H] = JOBID.JT_SWORDMAN, 229 | [JOBID.JT_MAGICIAN_H] = JOBID.JT_MAGICIAN, 230 | [JOBID.JT_ARCHER_H] = JOBID.JT_ARCHER, 231 | [JOBID.JT_ACOLYTE_H] = JOBID.JT_ACOLYTE, 232 | [JOBID.JT_MERCHANT_H] = JOBID.JT_MERCHANT, 233 | [JOBID.JT_THIEF_H] = JOBID.JT_THIEF, 234 | [JOBID.JT_KNIGHT_H] = JOBID.JT_KNIGHT, 235 | [JOBID.JT_PRIEST_H] = JOBID.JT_PRIEST, 236 | [JOBID.JT_WIZARD_H] = JOBID.JT_WIZARD, 237 | [JOBID.JT_BLACKSMITH_H] = JOBID.JT_BLACKSMITH, 238 | [JOBID.JT_HUNTER_H] = JOBID.JT_HUNTER, 239 | [JOBID.JT_ASSASSIN_H] = JOBID.JT_ASSASSIN, 240 | [JOBID.JT_CRUSADER_H] = JOBID.JT_CRUSADER, 241 | [JOBID.JT_MONK_H] = JOBID.JT_MONK, 242 | [JOBID.JT_SAGE_H] = JOBID.JT_SAGE, 243 | [JOBID.JT_ROGUE_H] = JOBID.JT_ROGUE, 244 | [JOBID.JT_ALCHEMIST_H] = JOBID.JT_ALCHEMIST, 245 | [JOBID.JT_BARD_H] = JOBID.JT_BARD, 246 | [JOBID.JT_DANCER_H] = JOBID.JT_DANCER, 247 | [JOBID.JT_NOVICE_B] = JOBID.JT_NOVICE, 248 | [JOBID.JT_SWORDMAN_B] = JOBID.JT_SWORDMAN, 249 | [JOBID.JT_MAGICIAN_B] = JOBID.JT_MAGICIAN, 250 | [JOBID.JT_ARCHER_B] = JOBID.JT_ARCHER, 251 | [JOBID.JT_ACOLYTE_B] = JOBID.JT_ACOLYTE, 252 | [JOBID.JT_MERCHANT_B] = JOBID.JT_MERCHANT, 253 | [JOBID.JT_THIEF_B] = JOBID.JT_THIEF, 254 | [JOBID.JT_KNIGHT_B] = JOBID.JT_KNIGHT, 255 | [JOBID.JT_PRIEST_B] = JOBID.JT_PRIEST, 256 | [JOBID.JT_WIZARD_B] = JOBID.JT_WIZARD, 257 | [JOBID.JT_BLACKSMITH_B] = JOBID.JT_BLACKSMITH, 258 | [JOBID.JT_HUNTER_B] = JOBID.JT_HUNTER, 259 | [JOBID.JT_ASSASSIN_B] = JOBID.JT_ASSASSIN, 260 | [JOBID.JT_CRUSADER_B] = JOBID.JT_CRUSADER, 261 | [JOBID.JT_MONK_B] = JOBID.JT_MONK, 262 | [JOBID.JT_SAGE_B] = JOBID.JT_SAGE, 263 | [JOBID.JT_ROGUE_B] = JOBID.JT_ROGUE, 264 | [JOBID.JT_ALCHEMIST_B] = JOBID.JT_ALCHEMIST, 265 | [JOBID.JT_BARD_B] = JOBID.JT_BARD, 266 | [JOBID.JT_DANCER_B] = JOBID.JT_DANCER, 267 | [JOBID.JT_SUPERNOVICE_B] = JOBID.JT_SUPERNOVICE, 268 | [JOBID.JT_TAEKWON] = JOBID.JT_NOVICE, 269 | [JOBID.JT_STAR] = JOBID.JT_TAEKWON, 270 | [JOBID.JT_LINKER] = JOBID.JT_TAEKWON, 271 | [JOBID.JT_RUNE_KNIGHT] = JOBID.JT_KNIGHT, 272 | [JOBID.JT_WARLOCK] = JOBID.JT_WIZARD, 273 | [JOBID.JT_RANGER] = JOBID.JT_HUNTER, 274 | [JOBID.JT_ARCHBISHOP] = JOBID.JT_PRIEST, 275 | [JOBID.JT_MECHANIC] = JOBID.JT_BLACKSMITH, 276 | [JOBID.JT_GUILLOTINE_CROSS] = JOBID.JT_ASSASSIN, 277 | [JOBID.JT_RUNE_KNIGHT_H] = JOBID.JT_KNIGHT_H, 278 | [JOBID.JT_WARLOCK_H] = JOBID.JT_WIZARD_H, 279 | [JOBID.JT_RANGER_H] = JOBID.JT_HUNTER_H, 280 | [JOBID.JT_ARCHBISHOP_H] = JOBID.JT_PRIEST_H, 281 | [JOBID.JT_MECHANIC_H] = JOBID.JT_BLACKSMITH_H, 282 | [JOBID.JT_GUILLOTINE_CROSS_H] = JOBID.JT_ASSASSIN_H, 283 | [JOBID.JT_ROYAL_GUARD] = JOBID.JT_CRUSADER, 284 | [JOBID.JT_SORCERER] = JOBID.JT_SAGE, 285 | [JOBID.JT_MINSTREL] = JOBID.JT_BARD, 286 | [JOBID.JT_WANDERER] = JOBID.JT_DANCER, 287 | [JOBID.JT_SURA] = JOBID.JT_MONK, 288 | [JOBID.JT_GENETIC] = JOBID.JT_ALCHEMIST, 289 | [JOBID.JT_SHADOW_CHASER] = JOBID.JT_ROGUE, 290 | [JOBID.JT_ROYAL_GUARD_H] = JOBID.JT_CRUSADER_H, 291 | [JOBID.JT_SORCERER_H] = JOBID.JT_SAGE_H, 292 | [JOBID.JT_MINSTREL_H] = JOBID.JT_BARD_H, 293 | [JOBID.JT_WANDERER_H] = JOBID.JT_DANCER_H, 294 | [JOBID.JT_SURA_H] = JOBID.JT_MONK_H, 295 | [JOBID.JT_GENETIC_H] = JOBID.JT_ALCHEMIST_H, 296 | [JOBID.JT_SHADOW_CHASER_H] = JOBID.JT_ROGUE_H, 297 | [JOBID.JT_RUNE_KNIGHT_B] = JOBID.JT_RUNE_KNIGHT, 298 | [JOBID.JT_WARLOCK_B] = JOBID.JT_WARLOCK, 299 | [JOBID.JT_RANGER_B] = JOBID.JT_RANGER, 300 | [JOBID.JT_ARCHBISHOP_B] = JOBID.JT_ARCHBISHOP, 301 | [JOBID.JT_MECHANIC_B] = JOBID.JT_MECHANIC, 302 | [JOBID.JT_GUILLOTINE_CROSS_B] = JOBID.JT_GUILLOTINE_CROSS, 303 | [JOBID.JT_ROYAL_GUARD_B] = JOBID.JT_ROYAL_GUARD, 304 | [JOBID.JT_SORCERER_B] = JOBID.JT_SORCERER, 305 | [JOBID.JT_MINSTREL_B] = JOBID.JT_MINSTREL, 306 | [JOBID.JT_WANDERER_B] = JOBID.JT_WANDERER, 307 | [JOBID.JT_SURA_B] = JOBID.JT_SURA, 308 | [JOBID.JT_GENETIC_B] = JOBID.JT_GENETIC, 309 | [JOBID.JT_SHADOW_CHASER_B] = JOBID.JT_SHADOW_CHASER, 310 | [JOBID.JT_SUPERNOVICE2] = JOBID.JT_SUPERNOVICE, 311 | [JOBID.JT_SUPERNOVICE2_B] = JOBID.JT_SUPERNOVICE2, 312 | [JOBID.JT_KAGEROU] = JOBID.JT_NINJA, 313 | [JOBID.JT_OBORO] = JOBID.JT_NINJA, 314 | ["__newindex"] = function () error("unknown state") end 315 | } 316 | setmetatable(JOB_INHERIT_LIST, JOB_INHERIT_LIST) 317 | 318 | JOB_INHERIT_LIST2 = { 319 | 320 | [JOBID.JT_RUNE_KNIGHT_H] = JOBID.JT_RUNE_KNIGHT, 321 | [JOBID.JT_WARLOCK_H] = JOBID.JT_WARLOCK, 322 | [JOBID.JT_RANGER_H] = JOBID.JT_RANGER, 323 | [JOBID.JT_ARCHBISHOP_H] = JOBID.JT_ARCHBISHOP, 324 | [JOBID.JT_MECHANIC_H] = JOBID.JT_MECHANIC, 325 | [JOBID.JT_GUILLOTINE_CROSS_H] = JOBID.JT_GUILLOTINE_CROSS, 326 | [JOBID.JT_ROYAL_GUARD_H] = JOBID.JT_ROYAL_GUARD, 327 | [JOBID.JT_SORCERER_H] = JOBID.JT_SORCERER, 328 | [JOBID.JT_MINSTREL_H] = JOBID.JT_MINSTREL, 329 | [JOBID.JT_WANDERER_H] = JOBID.JT_WANDERER, 330 | [JOBID.JT_SURA_H] = JOBID.JT_SURA, 331 | [JOBID.JT_GENETIC_H] = JOBID.JT_GENETIC, 332 | [JOBID.JT_SHADOW_CHASER_H] = JOBID.JT_SHADOW_CHASER, 333 | ["__newindex"] = function () error("unknown state") end 334 | } 335 | setmetatable(JOB_INHERIT_LIST2, JOB_INHERIT_LIST2) -------------------------------------------------------------------------------- /client/lua files/spreditinfo/smalllayerdir_male.lua: -------------------------------------------------------------------------------- 1 | SmallLayerDir_M = { 2 | 3 | [JOBID.JT_ROYAL_GUARD] = { 4 | [18] = { 0, 1, 2 }, 5 | [22] = { 0, 1, 2 }, 6 | }, 7 | 8 | [JOBID.JT_GUNSLINGER] = { 9 | [2] = { 0, 1, 2 }, 10 | [6] = { 0, 1, 2 }, 11 | [10] = { 0, 1, 2, 3, 4 }, 12 | [14] = { 0, 1, 2, 3, 4 }, 13 | }, 14 | 15 | [JOBID.JT_SWORDMAN] = { 16 | [10] = { 0, 4, 5, 6, 7 }, 17 | [14] = { 0, 4, 5, 6, 7 }, 18 | [18] = { 0, 1, 2 }, 19 | [22] = { 0, 1, 2 }, 20 | [34] = { 0, 1, 2, 3, 4, 5 }, 21 | [35] = { 0, 1, 2, 3, 4, 5 }, 22 | [36] = { 0, 1, 2, 3, 4, 5 }, 23 | [37] = { 0, 1, 2, 3, 4, 5 }, 24 | [42] = { 0, 1 }, 25 | [43] = { 0, 1 }, 26 | [44] = { 0, 1 }, 27 | [45] = { 0, 1 }, 28 | [82] = { 0, 1, 2, 3, 4 }, 29 | [83] = { 0, 1, 2, 3, 4 }, 30 | [84] = { 0, 1, 2, 3, 4 }, 31 | [85] = { 0, 1, 2, 3, 4 }, 32 | [90] = { 0, 1, 2, 3, 4 }, 33 | [91] = { 0, 1, 2, 3, 4 }, 34 | [92] = { 0, 1, 2, 3, 4 }, 35 | [93] = { 0, 1, 2, 3, 4 }, 36 | [98] = { 0, 1, 2, 3, 4, 5 }, 37 | [99] = { 0, 1, 2, 3, 4, 5 }, 38 | [100] = { 0, 1, 2, 3, 4, 5 }, 39 | [101] = { 0, 1, 2, 3, 4, 5 }, 40 | }, 41 | 42 | [JOBID.JT_MARRIED] = { 43 | [2] = { 0, 1, 2 }, 44 | [6] = { 0, 1, 2 }, 45 | [10] = { 0, 1, 2, 6, 7 }, 46 | [14] = { 0, 1, 2, 6, 7 }, 47 | }, 48 | 49 | [JOBID.JT_ARCHER] = { 50 | [10] = { 0, 5, 7, 8 }, 51 | [14] = { 0, 5, 7, 8 }, 52 | [32] = { 0, 1, 2, 3, 4, 5 }, 53 | [33] = { 0, 1, 2, 3, 4, 5 }, 54 | [34] = { 0, 1, 2, 3, 4, 5 }, 55 | [35] = { 0, 1, 2, 3, 4, 5 }, 56 | [36] = { 0, 1, 2, 3, 4, 5 }, 57 | [37] = { 0, 1, 2, 3, 4, 5 }, 58 | [38] = { 0, 1, 2, 3, 4, 5 }, 59 | [39] = { 0, 1, 2, 3, 4, 5 }, 60 | [40] = { 0, 1 }, 61 | [41] = { 0, 1 }, 62 | [42] = { 0, 1 }, 63 | [43] = { 0, 1 }, 64 | [44] = { 0, 1 }, 65 | [45] = { 0, 1 }, 66 | [46] = { 0, 1 }, 67 | [47] = { 0, 1 }, 68 | [48] = { 0, 1, 2 }, 69 | [49] = { 0, 1, 2 }, 70 | [50] = { 0, 1, 2 }, 71 | [51] = { 0, 1, 2 }, 72 | [52] = { 0, 1, 2 }, 73 | [53] = { 0, 1, 2 }, 74 | [54] = { 0, 1, 2 }, 75 | [55] = { 0, 1, 2 }, 76 | [56] = { 0 }, 77 | [57] = { 0 }, 78 | [58] = { 0 }, 79 | [59] = { 0 }, 80 | [60] = { 0 }, 81 | [61] = { 0 }, 82 | [62] = { 0 }, 83 | [63] = { 0 }, 84 | [72] = { 0 }, 85 | [73] = { 0 }, 86 | [74] = { 0 }, 87 | [75] = { 0 }, 88 | [76] = { 0 }, 89 | [77] = { 0 }, 90 | [78] = { 0 }, 91 | [79] = { 0 }, 92 | [82] = { 3, 4, 5, 6, 7, 8 }, 93 | [83] = { 3, 4, 5, 6, 7, 8 }, 94 | [84] = { 3, 4, 5, 6, 7, 8 }, 95 | [85] = { 3, 4, 5, 6, 7, 8 }, 96 | [90] = { 0, 1, 2, 3 }, 97 | [91] = { 0, 1, 2, 3 }, 98 | [92] = { 0, 1, 2, 3 }, 99 | [93] = { 0, 1, 2, 3 }, 100 | [96] = { 0, 1, 2, 3, 4, 5 }, 101 | [97] = { 0, 1, 2, 3, 4, 5 }, 102 | [98] = { 0, 1, 2, 3, 4, 5 }, 103 | [99] = { 0, 1, 2, 3, 4, 5 }, 104 | [100] = { 0, 1, 2, 3, 4, 5 }, 105 | [101] = { 0, 1, 2, 3, 4, 5 }, 106 | [102] = { 0, 1, 2, 3, 4, 5 }, 107 | [103] = { 0, 1, 2, 3, 4, 5 }, 108 | }, 109 | 110 | [JOBID.JT_STAR] = { 111 | [10] = { 5, 6, 7 }, 112 | [14] = { 5, 6, 7 }, 113 | }, 114 | 115 | [JOBID.JT_STAR2] = { 116 | [2] = { 0, 1, 2 }, 117 | [6] = { 0, 1, 2 }, 118 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 119 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 120 | }, 121 | 122 | [JOBID.JT_ROYAL_CHICKEN] = { 123 | [2] = { 0, 1, 2 }, 124 | [6] = { 0, 1, 2 }, 125 | [10] = { 4, 5, 6, 7 }, 126 | [14] = { 4, 5, 6, 7 }, 127 | [18] = { 0, 1, 2 }, 128 | [22] = { 0, 1, 2 }, 129 | }, 130 | 131 | [JOBID.JT_KNIGHT] = { 132 | [2] = { 0, 1, 2 }, 133 | [6] = { 0, 1, 2 }, 134 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 135 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 136 | [18] = { 0, 1, 2 }, 137 | [22] = { 0, 1, 2 }, 138 | [32] = { 0, 1, 2 }, 139 | [33] = { 0, 1, 2 }, 140 | [38] = { 0, 1, 2, 3, 4, 5 }, 141 | [39] = { 0, 1, 2, 3, 4, 5 }, 142 | [40] = { 3, 4 }, 143 | [41] = { 3, 4 }, 144 | [46] = { 3, 4 }, 145 | [47] = { 3, 4 }, 146 | [82] = { 6, 7, 8 }, 147 | [83] = { 6, 7, 8 }, 148 | [84] = { 6, 7, 8 }, 149 | [85] = { 6, 7, 8 }, 150 | [98] = { 0, 1, 2, 3, 4, 5 }, 151 | [99] = { 0, 1, 2, 3, 4, 5 }, 152 | [100] = { 0, 1, 2, 3, 4, 5 }, 153 | [101] = { 0, 1, 2, 3, 4, 5 }, 154 | }, 155 | 156 | [JOBID.JT_GUILLOTINE_CROSS] = { 157 | [2] = { 0, 1, 2 }, 158 | [6] = { 0, 1, 2 }, 159 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 160 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 161 | [18] = { 0, 1, 2 }, 162 | [22] = { 0, 1, 2 }, 163 | }, 164 | 165 | [JOBID.JT_NINJA] = { 166 | [10] = { 7, 8 }, 167 | [14] = { 7, 8 }, 168 | }, 169 | 170 | [JOBID.JT_THIEF] = { 171 | [2] = { 0, 1, 2 }, 172 | [6] = { 0, 1, 2 }, 173 | [10] = { 0, 5, 6, 7 }, 174 | [14] = { 0, 5, 6, 7 }, 175 | [18] = { 0, 1, 2 }, 176 | [22] = { 0, 1, 2 }, 177 | [88] = { 0, 1 }, 178 | [89] = { 0, 1 }, 179 | [94] = { 0, 1 }, 180 | [95] = { 0, 1 }, 181 | }, 182 | 183 | [JOBID.JT_RANGER] = { 184 | [2] = { 0, 1, 2 }, 185 | [6] = { 0, 1, 2 }, 186 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 187 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 188 | [18] = { 0, 1, 2 }, 189 | [22] = { 0, 1, 2 }, 190 | }, 191 | 192 | [JOBID.JT_ROGUE] = { 193 | [2] = { 0, 1, 2 }, 194 | [6] = { 0, 1, 2 }, 195 | [10] = { 0, 4, 5, 6, 7 }, 196 | [14] = { 0, 4, 5, 6, 7 }, 197 | [18] = { 0, 1, 2 }, 198 | [22] = { 0, 1, 2 }, 199 | [42] = { 1, 2 }, 200 | [43] = { 1, 2 }, 201 | [44] = { 1, 2 }, 202 | [45] = { 1, 2 }, 203 | [82] = { 5, 6, 7, 8 }, 204 | [83] = { 5, 6, 7, 8 }, 205 | [84] = { 5, 6, 7, 8 }, 206 | [85] = { 5, 6, 7, 8 }, 207 | [88] = { 0, 1 }, 208 | [89] = { 0, 1 }, 209 | [94] = { 0, 1 }, 210 | [95] = { 0, 1 }, 211 | }, 212 | 213 | [JOBID.JT_KNIGHT_H] = { 214 | [2] = { 0, 1, 2 }, 215 | [6] = { 0, 1, 2 }, 216 | [10] = { 0, 4, 5, 6, 7 }, 217 | [14] = { 0, 4, 5, 6, 7 }, 218 | [18] = { 0, 1, 2 }, 219 | [22] = { 0, 1, 2 }, 220 | [32] = { 0, 1, 2, 3, 4, 5 }, 221 | [33] = { 0, 1, 2, 3, 4, 5 }, 222 | [38] = { 0, 1, 2, 3, 4, 5 }, 223 | [39] = { 0, 1, 2, 3, 4, 5 }, 224 | [82] = { 6 }, 225 | [83] = { 6 }, 226 | [84] = { 6 }, 227 | [85] = { 6 }, 228 | [99] = { 0, 1, 2, 3, 4, 5 }, 229 | [100] = { 0, 1, 2, 3, 4, 5 }, 230 | [101] = { 0, 1, 2, 3, 4, 5 }, 231 | }, 232 | 233 | [JOBID.JT_RUNE_KNIGHT] = { 234 | [2] = { 0, 1, 2 }, 235 | [6] = { 0, 1, 2 }, 236 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 237 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 238 | }, 239 | 240 | [JOBID.JT_MONK] = { 241 | [10] = { 5, 6, 7 }, 242 | [14] = { 5, 6, 7 }, 243 | [82] = { 2, 3, 4, 5 }, 244 | [83] = { 2, 3, 4, 5 }, 245 | [84] = { 2, 3, 4, 5 }, 246 | [85] = { 2, 3, 4, 5 }, 247 | [90] = { 2, 3, 4 }, 248 | [91] = { 2, 3, 4 }, 249 | [92] = { 2, 3, 4 }, 250 | [93] = { 2, 3, 4 }, 251 | [96] = { 0, 1, 3, 5 }, 252 | [97] = { 0, 1, 3, 5 }, 253 | [98] = { 1, 3 }, 254 | [99] = { 1, 3 }, 255 | [100] = { 1, 3 }, 256 | [101] = { 1, 3 }, 257 | [102] = { 0, 1, 3, 5 }, 258 | [103] = { 0, 1, 3, 5 }, 259 | }, 260 | 261 | [JOBID.JT_MECHANIC] = { 262 | [10] = { 5, 6, 7 }, 263 | [14] = { 5, 6, 7 }, 264 | }, 265 | 266 | [JOBID.JT_MINSTREL] = { 267 | [18] = { 0, 1, 2 }, 268 | [22] = { 0, 1, 2 }, 269 | }, 270 | 271 | [JOBID.JT_BARD] = { 272 | [10] = { 5, 6, 7 }, 273 | [14] = { 5, 6, 7 }, 274 | [90] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 275 | [91] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 276 | [92] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 277 | [93] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 278 | }, 279 | 280 | [JOBID.JT_MERCHANT] = { 281 | [10] = { 0, 1, 2, 7 }, 282 | [14] = { 0, 1, 2, 7 }, 283 | }, 284 | 285 | [JOBID.JT_ACOLYTE] = { 286 | [10] = { 5, 6, 7 }, 287 | [14] = { 5, 6, 7 }, 288 | }, 289 | 290 | [JOBID.JT_SAGE] = { 291 | [2] = { 0, 1, 2 }, 292 | [6] = { 0, 1, 2 }, 293 | [10] = { 0, 4, 5, 6, 7 }, 294 | [14] = { 0, 4, 5, 6, 7 }, 295 | [88] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 296 | [89] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 297 | [90] = { 0, 1, 2, 3, 4 }, 298 | [91] = { 0, 1, 2, 3, 4 }, 299 | [92] = { 0, 1, 2, 3, 4 }, 300 | [93] = { 0, 1, 2, 3, 4 }, 301 | [94] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 302 | [95] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 303 | }, 304 | 305 | [JOBID.JT_SORCERER] = { 306 | [2] = { 0, 1, 2 }, 307 | [6] = { 0, 1, 2 }, 308 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 309 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 310 | [18] = { 0, 1, 2 }, 311 | [22] = { 0, 1, 2 }, 312 | }, 313 | 314 | [JOBID.JT_LINKER] = { 315 | [2] = { 0, 1, 2 }, 316 | [6] = { 0, 1, 2 }, 317 | [10] = { 0, 1, 2, 3, 4, 5, 7 }, 318 | [14] = { 0, 1, 2, 3, 4, 5, 7 }, 319 | [18] = { 0, 1, 2 }, 320 | [22] = { 0, 1, 2 }, 321 | }, 322 | 323 | [JOBID.JT_SHADOW_CHASER] = { 324 | [2] = { 0, 1, 2 }, 325 | [6] = { 0, 1, 2 }, 326 | [42] = { 1, 2 }, 327 | [43] = { 1, 2 }, 328 | [44] = { 1, 2 }, 329 | [45] = { 1, 2 }, 330 | }, 331 | 332 | [JOBID.JT_SURA] = { 333 | [2] = { 0, 1, 2 }, 334 | [6] = { 0, 1, 2 }, 335 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 336 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 337 | [18] = { 0, 1, 2 }, 338 | [22] = { 0, 1, 2 }, 339 | [82] = { 1, 2, 3, 4 }, 340 | [83] = { 1, 2, 3, 4 }, 341 | [84] = { 1, 2, 3, 4 }, 342 | [85] = { 1, 2, 3, 4 }, 343 | [90] = { 1, 2, 3, 4 }, 344 | [91] = { 1, 2, 3, 4 }, 345 | [92] = { 1, 2, 3, 4 }, 346 | [93] = { 1, 2, 3, 4 }, 347 | }, 348 | 349 | [JOBID.JT_HUNTER_H] = { 350 | [10] = { 5, 6, 7 }, 351 | [14] = { 5, 6, 7 }, 352 | [41] = { 1, 2 }, 353 | [46] = { 1, 2 }, 354 | [47] = { 1, 2 }, 355 | [80] = { 1, 2, 3, 4 }, 356 | [81] = { 1, 2, 3, 4 }, 357 | [86] = { 1, 2, 3, 4 }, 358 | [87] = { 1, 2, 3, 4 }, 359 | [94] = { 4 }, 360 | [95] = { 4 }, 361 | [102] = { 4 }, 362 | [103] = { 4 }, 363 | }, 364 | 365 | [JOBID.JT_ROGUE_H] = { 366 | [2] = { 0, 1, 2 }, 367 | [6] = { 0, 1, 2 }, 368 | [10] = { 5, 6, 7 }, 369 | [14] = { 5, 6, 7 }, 370 | [17] = { 0, 1, 2 }, 371 | [23] = { 0, 1, 2 }, 372 | [40] = { 1, 2 }, 373 | [41] = { 1, 2 }, 374 | [42] = { 1, 2 }, 375 | [43] = { 1, 2 }, 376 | [44] = { 1, 2 }, 377 | [45] = { 1, 2 }, 378 | [46] = { 1, 2 }, 379 | [47] = { 1, 2 }, 380 | [64] = { 0 }, 381 | [65] = { 0 }, 382 | [66] = { 0 }, 383 | [67] = { 0 }, 384 | [68] = { 0 }, 385 | [69] = { 0 }, 386 | [70] = { 0 }, 387 | [71] = { 0 }, 388 | [80] = { 5, 6, 7, 8 }, 389 | [81] = { 5, 6, 7, 8 }, 390 | [82] = { 5, 6, 7, 8 }, 391 | [83] = { 5, 6, 7, 8 }, 392 | [84] = { 5, 6, 7, 8 }, 393 | [85] = { 5, 6, 7, 8 }, 394 | [86] = { 5, 6, 7, 8 }, 395 | [87] = { 5, 6, 7, 8 }, 396 | [88] = { 0, 1 }, 397 | [89] = { 0, 1 }, 398 | [94] = { 0, 1 }, 399 | [95] = { 0, 1 }, 400 | }, 401 | 402 | [JOBID.JT_ARCHBISHOP] = { 403 | [2] = { 0, 1, 2 }, 404 | [6] = { 0, 1, 2 }, 405 | [10] = { 0, 1, 3, 4, 5, 6, 7 }, 406 | [14] = { 0, 1, 3, 4, 5, 6, 7 }, 407 | [18] = { 0, 1, 2 }, 408 | [22] = { 0, 1, 2 }, 409 | }, 410 | 411 | [JOBID.JT_ALCHEMIST] = { 412 | [10] = { 5, 6, 7 }, 413 | [14] = { 5, 6, 7 }, 414 | [40] = { 3, 4 }, 415 | [41] = { 3, 4 }, 416 | [46] = { 3, 4 }, 417 | [47] = { 3, 4 }, 418 | [88] = { 5, 6, 7 }, 419 | [89] = { 5, 6, 7 }, 420 | [90] = { 4 }, 421 | [91] = { 4 }, 422 | [92] = { 4 }, 423 | [93] = { 4 }, 424 | [94] = { 5, 6, 7 }, 425 | [95] = { 5, 6, 7 }, 426 | }, 427 | 428 | [JOBID.JT_ASSASSIN] = { 429 | [2] = { 0, 1, 2 }, 430 | [6] = { 0, 1, 2 }, 431 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 432 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 433 | [40] = { 1 }, 434 | [41] = { 1 }, 435 | [46] = { 1 }, 436 | [47] = { 1 }, 437 | [48] = { 0, 1, 2 }, 438 | [49] = { 0, 1, 2 }, 439 | [54] = { 0, 1, 2 }, 440 | [55] = { 0, 1, 2 }, 441 | [56] = { 0 }, 442 | [57] = { 0 }, 443 | [62] = { 0 }, 444 | [63] = { 0 }, 445 | [80] = { 2, 3 }, 446 | [81] = { 2, 3 }, 447 | [86] = { 2, 3 }, 448 | [87] = { 2, 3 }, 449 | [88] = { 1, 2, 6, 7 }, 450 | [89] = { 1, 2, 6, 7 }, 451 | [94] = { 1, 2, 6, 7 }, 452 | [95] = { 1, 2, 6, 7 }, 453 | [96] = { 1 }, 454 | [97] = { 1 }, 455 | [102] = { 1 }, 456 | [103] = { 1 }, 457 | }, 458 | 459 | [JOBID.JT_ASSASSIN_H] = { 460 | [10] = { 1, 2, 3 }, 461 | [14] = { 1, 2, 3 }, 462 | [80] = { 3 }, 463 | [81] = { 3 }, 464 | [86] = { 2, 3 }, 465 | [87] = { 2, 3 }, 466 | [88] = { 2 }, 467 | [89] = { 2 }, 468 | [94] = { 6, 7 }, 469 | [95] = { 6, 7 }, 470 | }, 471 | 472 | [JOBID.JT_SUMMER] = { 473 | [10] = { 4, 5, 6 }, 474 | [14] = { 4, 5, 6 }, 475 | [18] = { 0, 1, 2 }, 476 | [22] = { 0, 1, 2 }, 477 | }, 478 | 479 | [JOBID.JT_WARLOCK] = { 480 | [2] = { 0, 1, 2 }, 481 | [6] = { 0, 1, 2 }, 482 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 483 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 484 | [18] = { 0, 1, 2 }, 485 | [22] = { 0, 1, 2 }, 486 | }, 487 | 488 | [JOBID.JT_WIZARD] = { 489 | [10] = { 1, 2, 3, 4 }, 490 | [14] = { 1, 2, 3, 4 }, 491 | [80] = { 1, 2, 3 }, 492 | [81] = { 1, 2, 3 }, 493 | [86] = { 1, 2, 3 }, 494 | [87] = { 1, 2, 3 }, 495 | }, 496 | 497 | [JOBID.JT_GENETIC] = { 498 | [2] = { 0, 1, 2 }, 499 | [6] = { 0, 1, 2 }, 500 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 501 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 502 | [18] = { 0, 1, 2 }, 503 | [22] = { 0, 1, 2 }, 504 | }, 505 | 506 | [JOBID.JT_BLACKSMITH] = { 507 | 508 | }, 509 | 510 | [JOBID.JT_MONK_H] = { 511 | [10] = { 5, 6, 7 }, 512 | [14] = { 5, 6, 7 }, 513 | [18] = { 0, 1, 2 }, 514 | [22] = { 0, 1, 2 }, 515 | [82] = { 2, 3, 4, 5 }, 516 | [83] = { 2, 3, 4, 5 }, 517 | [84] = { 2, 3, 4, 5 }, 518 | [85] = { 2, 3, 4, 5 }, 519 | [90] = { 2, 3, 4 }, 520 | [91] = { 2, 3, 4 }, 521 | [92] = { 2, 3, 4 }, 522 | [93] = { 2, 3, 4 }, 523 | }, 524 | 525 | [JOBID.JT_NOVICE] = { 526 | [90] = { 1, 2, 3 }, 527 | [91] = { 1, 2, 3 }, 528 | [92] = { 1, 2, 3 }, 529 | [93] = { 1, 2, 3 }, 530 | }, 531 | 532 | [JOBID.JT_ALCHEMIST_H] = { 533 | [10] = { 5, 6, 7 }, 534 | [14] = { 5, 6, 7 }, 535 | [32] = { 0, 1, 2, 3, 4, 5 }, 536 | [33] = { 0, 1, 2, 3, 4, 5 }, 537 | [34] = { 0, 1, 2, 3, 4, 5 }, 538 | [35] = { 0, 1, 2, 3, 4, 5 }, 539 | [36] = { 0, 1, 2, 3, 4, 5 }, 540 | [37] = { 0, 1, 2, 3, 4, 5 }, 541 | [38] = { 0, 1, 2, 3, 4, 5 }, 542 | [39] = { 0, 1, 2, 3, 4, 5 }, 543 | [40] = { 0 }, 544 | [41] = { 0 }, 545 | [42] = { 0, 1, 2 }, 546 | [43] = { 0, 1, 2 }, 547 | [44] = { 0, 1, 2 }, 548 | [45] = { 0, 1, 2 }, 549 | [46] = { 0 }, 550 | [47] = { 0 }, 551 | [48] = { 0, 1, 2 }, 552 | [49] = { 0, 1, 2 }, 553 | [54] = { 0, 1, 2 }, 554 | [55] = { 0, 1, 2 }, 555 | [56] = { 0 }, 556 | [57] = { 0 }, 557 | [62] = { 0 }, 558 | [63] = { 0 }, 559 | [80] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 560 | [81] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 561 | [86] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 562 | [87] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 563 | [88] = { 0, 1, 2, 3, 4, 6, 7 }, 564 | [89] = { 0, 1, 2, 3, 4, 6, 7 }, 565 | [94] = { 0, 1, 2, 3, 4, 6, 7 }, 566 | [95] = { 0, 1, 2, 3, 4, 6, 7 }, 567 | [96] = { 0, 1, 2, 3, 4, 5 }, 568 | [97] = { 0, 1, 2, 3, 4, 5 }, 569 | [102] = { 0, 1, 2, 3, 4, 5 }, 570 | [103] = { 0, 1, 2, 3, 4, 5 }, 571 | }, 572 | 573 | [JOBID.JT_BARD_H] = { 574 | [2] = { 0, 1, 2 }, 575 | [6] = { 0, 1, 2 }, 576 | [10] = { 4, 5, 6, 7 }, 577 | [14] = { 4, 5, 6, 7 }, 578 | [42] = { 1, 2 }, 579 | [43] = { 1, 2 }, 580 | [44] = { 1, 2 }, 581 | [45] = { 1, 2 }, 582 | [48] = { 0, 1, 2 }, 583 | [49] = { 0, 1, 2 }, 584 | [54] = { 0, 1, 2 }, 585 | [55] = { 0, 1, 2 }, 586 | [56] = { 0 }, 587 | [57] = { 0 }, 588 | [62] = { 0 }, 589 | [63] = { 0 }, 590 | [64] = { 0 }, 591 | [65] = { 0 }, 592 | [66] = { 0 }, 593 | [67] = { 0 }, 594 | [68] = { 0 }, 595 | [69] = { 0 }, 596 | [70] = { 0 }, 597 | [80] = { 4, 5, 6, 7, 8 }, 598 | [81] = { 4, 5, 6, 7, 8 }, 599 | [86] = { 4, 5, 6, 7, 8 }, 600 | [87] = { 4, 5, 6, 7, 8 }, 601 | [90] = { 3, 4, 5, 6, 7 }, 602 | [91] = { 3, 4, 5, 6, 7 }, 603 | [92] = { 3, 4, 5, 6, 7 }, 604 | [93] = { 3, 4, 5, 6, 7 }, 605 | }, 606 | 607 | [JOBID.JT_TAEKWON] = { 608 | [10] = { 4, 5, 6, 7 }, 609 | [14] = { 4, 5, 6, 7 }, 610 | }, 611 | 612 | [JOBID.JT_CHICKEN] = { 613 | 614 | }, 615 | 616 | [JOBID.JT_SAGE_H] = { 617 | [2] = { 0, 1, 2 }, 618 | [6] = { 0, 1, 2 }, 619 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 620 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 621 | [18] = { 0, 1, 2 }, 622 | [22] = { 0, 1, 2 }, 623 | [40] = { 1, 2, 3, 4 }, 624 | [41] = { 1, 2, 3, 4 }, 625 | [46] = { 1, 2, 3, 4 }, 626 | [47] = { 1, 2, 3, 4 }, 627 | [64] = { 0 }, 628 | [65] = { 0 }, 629 | [66] = { 0 }, 630 | [67] = { 0 }, 631 | [68] = { 0 }, 632 | [69] = { 0 }, 633 | [70] = { 0 }, 634 | [71] = { 0 }, 635 | [80] = { 5, 6, 7, 8 }, 636 | [81] = { 5, 6, 7, 8 }, 637 | [86] = { 5, 6, 7, 8 }, 638 | [87] = { 5, 6, 7, 8 }, 639 | [88] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 640 | [89] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 641 | [90] = { 0, 1, 2, 3, 4 }, 642 | [91] = { 0, 1, 2, 3, 4 }, 643 | [92] = { 0, 1, 2, 3, 4 }, 644 | [93] = { 0, 1, 2, 3, 4 }, 645 | [94] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 646 | [95] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 647 | }, 648 | 649 | [JOBID.JT_PRIEST] = { 650 | [10] = { 5, 6, 7 }, 651 | [14] = { 5, 6, 7 }, 652 | [34] = { 0, 1, 2, 3, 4, 5 }, 653 | [35] = { 0, 1, 2, 3, 4, 5 }, 654 | [36] = { 0, 1, 2, 3, 4, 5 }, 655 | [37] = { 0, 1, 2, 3, 4, 5 }, 656 | [40] = { 0, 1 }, 657 | [41] = { 0, 1 }, 658 | [46] = { 0, 1 }, 659 | [47] = { 0, 1 }, 660 | [80] = { 0, 1, 2 }, 661 | [81] = { 0, 1, 2 }, 662 | [82] = { 3 }, 663 | [83] = { 3 }, 664 | [84] = { 3 }, 665 | [85] = { 3 }, 666 | [86] = { 0, 1, 2 }, 667 | [87] = { 0, 1, 2 }, 668 | [88] = { 1, 2 }, 669 | [89] = { 1, 2 }, 670 | [90] = { 3 }, 671 | [91] = { 3 }, 672 | [92] = { 3 }, 673 | [93] = { 3 }, 674 | [94] = { 1, 2 }, 675 | [95] = { 1, 2 }, 676 | [96] = { 3, 4, 5 }, 677 | [97] = { 3, 4, 5 }, 678 | [98] = { 3, 4, 5 }, 679 | [99] = { 3, 4, 5 }, 680 | [100] = { 3, 4, 5 }, 681 | [101] = { 3, 4, 5 }, 682 | [102] = { 3, 4, 5 }, 683 | }, 684 | 685 | [JOBID.JT_WIZARD_H] = { 686 | [80] = { 3, 5, 6, 7, 8 }, 687 | [81] = { 3, 5, 6, 7, 8 }, 688 | [86] = { 5, 6, 7, 8 }, 689 | [87] = { 5, 6, 7 }, 690 | [88] = { 4, 5, 6 }, 691 | [89] = { 4, 5 }, 692 | [94] = { 4, 5, 6 }, 693 | [95] = { 4, 5, 6 }, 694 | [98] = { 2, 3, 4, 5 }, 695 | [99] = { 2, 3, 4, 5 }, 696 | [100] = { 2, 3, 4, 5 }, 697 | [101] = { 2, 3, 4, 5 }, 698 | }, 699 | 700 | [JOBID.JT_PRIEST_H] = { 701 | [10] = { 0, 4, 5, 6, 7 }, 702 | [11] = { 0, 4, 5, 6, 7 }, 703 | [34] = { 0, 1, 2, 3, 4, 5 }, 704 | [35] = { 0, 1, 2, 3, 4, 5 }, 705 | [36] = { 0, 1, 2, 3, 4, 5 }, 706 | [37] = { 0, 1, 2, 3, 4, 5 }, 707 | [40] = { 2 }, 708 | [41] = { 2 }, 709 | [46] = { 2 }, 710 | [47] = { 2 }, 711 | [80] = { 0, 1, 2 }, 712 | [81] = { 0, 1, 2 }, 713 | [86] = { 0, 1, 2 }, 714 | [87] = { 0, 1, 2 }, 715 | [88] = { 0, 1, 2 }, 716 | [89] = { 0, 1, 2 }, 717 | [94] = { 0, 1, 2 }, 718 | [95] = { 0, 1, 2 }, 719 | }, 720 | 721 | [JOBID.JT_HUNTER] = { 722 | [10] = { 4, 5, 6, 7 }, 723 | [14] = { 4, 5, 6, 7 }, 724 | [86] = { 1 }, 725 | [87] = { 1 }, 726 | [96] = { 4 }, 727 | [97] = { 4 }, 728 | [102] = { 4 }, 729 | [103] = { 4 }, 730 | }, 731 | 732 | [JOBID.JT_BLACKSMITH_H] = { 733 | [10] = { 5, 6, 7 }, 734 | [14] = { 5, 6, 7 }, 735 | [80] = { 4, 5, 6, 7, 8 }, 736 | [81] = { 4, 5, 6, 7, 8 }, 737 | [86] = { 4, 5, 6, 7, 8 }, 738 | [87] = { 4, 5, 6, 7, 8 }, 739 | [88] = { 3, 4, 5, 6, 7 }, 740 | [89] = { 3, 4, 5, 6, 7 }, 741 | [94] = { 3, 4, 5, 6, 7 }, 742 | [95] = { 3, 4, 5, 6, 7 }, 743 | [96] = { 5 }, 744 | [97] = { 5 }, 745 | [102] = { 5 }, 746 | [103] = { 5 }, 747 | }, 748 | 749 | [JOBID.JT_KAGEROU] = { 750 | [2] = { 0, 1, 2 }, 751 | [6] = { 0, 1, 2 }, 752 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 753 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 754 | } 755 | } -------------------------------------------------------------------------------- /client/lua files/spreditinfo/smalllayerdir_female.lua: -------------------------------------------------------------------------------- 1 | SmallLayerDir_F = { 2 | 3 | [JOBID.JT_SUMMER] = { 4 | [2] = { 0, 1, 2 }, 5 | [6] = { 0, 1, 2 }, 6 | [10] = { 0, 4, 5, 6, 7 }, 7 | [14] = { 0, 4, 5, 6, 7 }, 8 | [18] = { 0, 1, 2 }, 9 | [22] = { 0, 1, 2 }, 10 | }, 11 | 12 | [JOBID.JT_ALCHEMIST] = { 13 | [10] = { 5, 6, 7 }, 14 | [14] = { 5, 6, 7 }, 15 | [80] = { 7, 8 }, 16 | [81] = { 7, 8 }, 17 | [86] = { 7, 8 }, 18 | [87] = { 7, 8 }, 19 | }, 20 | 21 | [JOBID.JT_SAGE] = { 22 | [2] = { 0, 1, 2 }, 23 | [6] = { 0, 1, 2 }, 24 | [10] = { 5, 6, 7 }, 25 | [14] = { 5, 6, 7 }, 26 | [42] = { 2 }, 27 | [43] = { 2 }, 28 | [44] = { 2 }, 29 | [45] = { 2 }, 30 | [82] = { 2, 3 }, 31 | [83] = { 2, 3 }, 32 | [84] = { 2, 3 }, 33 | [85] = { 2, 3 }, 34 | [88] = { 1, 2 }, 35 | [89] = { 1, 2 }, 36 | [94] = { 1, 2 }, 37 | [95] = { 1, 2 }, 38 | [96] = { 1, 2, 3, 4, 5 }, 39 | [97] = { 1, 2, 3, 4, 5 }, 40 | [102] = { 1, 2, 3, 4, 5 }, 41 | [103] = { 1, 2, 3, 4, 5 }, 42 | }, 43 | 44 | [JOBID.JT_ARCHER] = { 45 | [2] = { 0, 1, 2 }, 46 | [6] = { 0, 1, 2 }, 47 | [10] = { 0, 4, 5, 6, 7 }, 48 | [14] = { 0, 4, 5, 6, 7 }, 49 | }, 50 | 51 | [JOBID.JT_HUNTER] = { 52 | [82] = { 4, 5, 6, 7, 8 }, 53 | [83] = { 4, 5, 6, 7, 8 }, 54 | [84] = { 4, 5, 6, 7, 8 }, 55 | [85] = { 4, 5, 6, 7, 8 }, 56 | [90] = { 3, 4, 5, 6, 7 }, 57 | [91] = { 3, 4, 5, 6, 7 }, 58 | [92] = { 3, 4, 5, 6, 7 }, 59 | [93] = { 3, 4, 5, 6, 7 }, 60 | }, 61 | 62 | [JOBID.JT_MERCHANT] = { 63 | [10] = { 2, 3, 4, 5, 6, 7 }, 64 | [14] = { 2, 3, 4, 5, 6, 7 }, 65 | [18] = { 0, 1, 2 }, 66 | [22] = { 0, 1, 2 }, 67 | [34] = { 0, 1, 2, 3, 4, 5 }, 68 | [35] = { 0, 1, 2, 3, 4, 5 }, 69 | [36] = { 0, 1, 2, 3, 4, 5 }, 70 | [37] = { 0, 1, 2, 3, 4, 5 }, 71 | [82] = { 0, 1, 2, 3 }, 72 | [83] = { 0, 1, 2, 3 }, 73 | [84] = { 0, 1, 2, 3 }, 74 | [85] = { 0, 1, 2, 3 }, 75 | [90] = { 0, 1, 2, 3 }, 76 | [91] = { 0, 1, 2, 3 }, 77 | [92] = { 0, 1, 2, 3 }, 78 | [93] = { 0, 1, 2, 3 }, 79 | }, 80 | 81 | [JOBID.JT_LINKER] = { 82 | [10] = { 0, 4, 5, 6, 7 }, 83 | [14] = { 0, 4, 5, 6, 7 }, 84 | [18] = { 0, 1, 2 }, 85 | [22] = { 0, 1, 2 }, 86 | [80] = { 0, 1, 2 }, 87 | [81] = { 0, 1, 2 }, 88 | [86] = { 0, 1, 2 }, 89 | [87] = { 0, 1, 2 }, 90 | }, 91 | 92 | [JOBID.JT_THIEF] = { 93 | [2] = { 0, 1, 2 }, 94 | [6] = { 0, 1, 2 }, 95 | [10] = { 0, 1, 4, 5, 6, 7 }, 96 | [14] = { 0, 1, 4, 5, 6, 7 }, 97 | [18] = { 0, 1, 2 }, 98 | [22] = { 0, 1, 2 }, 99 | [34] = { 0, 1, 2, 3, 4, 5 }, 100 | [35] = { 0, 1, 2, 3, 4, 5 }, 101 | [36] = { 0, 1, 2, 3, 4, 5 }, 102 | [37] = { 0, 1, 2, 3, 4, 5 }, 103 | [42] = { 0, 1, 2 }, 104 | [43] = { 0, 1, 2 }, 105 | [44] = { 0, 1, 2 }, 106 | [45] = { 0, 1, 2 }, 107 | [50] = { 0, 1, 2 }, 108 | [51] = { 0, 1, 2 }, 109 | [52] = { 0, 1, 2 }, 110 | [53] = { 0, 1, 2 }, 111 | [58] = { 0 }, 112 | [59] = { 0 }, 113 | [60] = { 0 }, 114 | [61] = { 0 }, 115 | [82] = { 0, 1, 2, 3 }, 116 | [83] = { 0, 1, 2, 3 }, 117 | [84] = { 0, 1, 2, 3 }, 118 | [85] = { 0, 1, 2, 3 }, 119 | [98] = { 0, 1, 2, 3, 4, 5 }, 120 | [99] = { 0, 1, 2, 3, 4, 5 }, 121 | [100] = { 0, 1, 2, 3, 4, 5 }, 122 | [101] = { 0, 1, 2, 3, 4, 5 }, 123 | }, 124 | 125 | [JOBID.JT_ROGUE] = { 126 | [2] = { 0, 1, 2 }, 127 | [6] = { 0, 1, 2 }, 128 | [10] = { 4, 5, 6, 7 }, 129 | [14] = { 4, 5, 6, 7 }, 130 | [18] = { 0, 1, 2 }, 131 | [22] = { 0, 1, 2 }, 132 | [34] = { 0, 1, 2, 3, 4, 5 }, 133 | [35] = { 0, 1, 2, 3, 4, 5 }, 134 | [36] = { 0, 1, 2, 3, 4, 5 }, 135 | [37] = { 0, 1, 2, 3, 4, 5 }, 136 | [42] = { 0, 1, 2 }, 137 | [43] = { 0, 1, 2 }, 138 | [44] = { 0, 1, 2 }, 139 | [45] = { 0, 1, 2 }, 140 | [50] = { 0, 1, 2 }, 141 | [51] = { 0, 1, 2 }, 142 | [52] = { 0, 1, 2 }, 143 | [53] = { 0, 1, 2 }, 144 | [58] = { 0 }, 145 | [59] = { 0 }, 146 | [60] = { 0 }, 147 | [61] = { 0 }, 148 | [82] = { 0, 1, 2, 3 }, 149 | [83] = { 0, 1, 2, 3 }, 150 | [84] = { 0, 1, 2, 3 }, 151 | [85] = { 0, 1, 2, 3 }, 152 | [90] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 153 | [91] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 154 | [92] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 155 | [93] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 156 | }, 157 | 158 | [JOBID.JT_SWORDMAN] = { 159 | [2] = { 0, 1, 2 }, 160 | [6] = { 0, 1, 2 }, 161 | [10] = { 5, 6, 7 }, 162 | [14] = { 5, 6, 7 }, 163 | [18] = { 0, 1, 2 }, 164 | [22] = { 0, 1, 2 }, 165 | }, 166 | 167 | [JOBID.JT_KNIGHT] = { 168 | [2] = { 0, 1, 2 }, 169 | [6] = { 0, 1, 2 }, 170 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 171 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 172 | [18] = { 0, 1, 2 }, 173 | [22] = { 0, 1, 2 }, 174 | [88] = { 0, 5, 6, 7 }, 175 | [89] = { 0, 5, 6, 7 }, 176 | [94] = { 0, 5, 6, 7 }, 177 | [95] = { 0, 5, 6, 7 }, 178 | }, 179 | 180 | [JOBID.JT_MAGICIAN] = { 181 | [10] = { 5, 6, 7 }, 182 | [14] = { 5, 6, 7 }, 183 | }, 184 | 185 | [JOBID.JT_MONK] = { 186 | [10] = { 5, 6, 7 }, 187 | [14] = { 5, 6, 7 }, 188 | [40] = { 3, 4 }, 189 | [41] = { 3, 4 }, 190 | [42] = { 2 }, 191 | [43] = { 2 }, 192 | [44] = { 2 }, 193 | [45] = { 2 }, 194 | [46] = { 3, 4 }, 195 | [47] = { 3, 4 }, 196 | }, 197 | 198 | [JOBID.JT_GUNSLINGER] = { 199 | [10] = { 1, 2, 3 }, 200 | [14] = { 1, 2, 3 }, 201 | }, 202 | 203 | [JOBID.JT_STAR] = { 204 | [2] = { 0, 1, 2 }, 205 | [6] = { 0, 1, 2 }, 206 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 207 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 208 | [18] = { 0, 1, 2 }, 209 | [22] = { 0, 1, 2 }, 210 | [88] = { 4, 6 }, 211 | [89] = { 4, 6 }, 212 | [90] = { 4 }, 213 | [91] = { 4 }, 214 | [92] = { 4 }, 215 | [93] = { 4 }, 216 | [94] = { 4, 6 }, 217 | [95] = { 4, 6 }, 218 | }, 219 | 220 | [JOBID.JT_ROYAL_GUARD] = { 221 | [10] = { 5, 6, 7 }, 222 | [14] = { 5, 6, 7 }, 223 | [18] = { 0, 1, 2 }, 224 | [22] = { 0, 1, 2 }, 225 | [82] = { 5 }, 226 | [83] = { 5 }, 227 | [84] = { 5 }, 228 | [85] = { 5 }, 229 | }, 230 | 231 | [JOBID.JT_STAR2] = { 232 | [2] = { 0, 1, 2 }, 233 | [6] = { 0, 1, 2 }, 234 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 235 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 236 | [18] = { 0, 1, 2 }, 237 | [22] = { 0, 1, 2 }, 238 | [88] = { 4, 6 }, 239 | [89] = { 4, 6 }, 240 | [90] = { 4 }, 241 | [91] = { 4 }, 242 | [92] = { 4 }, 243 | [93] = { 4 }, 244 | [94] = { 4, 6 }, 245 | [95] = { 4, 6 }, 246 | }, 247 | 248 | [JOBID.JT_ROYAL_CHICKEN] = { 249 | [2] = { 0, 1, 2 }, 250 | [6] = { 0, 1, 2 }, 251 | [10] = { 4, 5, 6, 7 }, 252 | [14] = { 4, 5, 6, 7 }, 253 | [18] = { 0, 1, 2 }, 254 | [22] = { 0, 1, 2 }, 255 | }, 256 | 257 | [JOBID.JT_GUILLOTINE_CROSS] = { 258 | [2] = { 0, 1, 2 }, 259 | [6] = { 0, 1, 2 }, 260 | [10] = { 0, 1, 4, 5, 6, 7 }, 261 | [14] = { 0, 1, 4, 5, 6, 7 }, 262 | [18] = { 0, 1, 2 }, 263 | [22] = { 0, 1, 2 }, 264 | }, 265 | 266 | [JOBID.JT_NINJA] = { 267 | [10] = { 5, 6, 7 }, 268 | [14] = { 5, 6, 7 }, 269 | }, 270 | 271 | [JOBID.JT_DANCER] = { 272 | [10] = { 4 }, 273 | [14] = { 4 }, 274 | [40] = { 3, 4 }, 275 | [41] = { 3, 4 }, 276 | [46] = { 3, 4 }, 277 | [47] = { 3, 4 }, 278 | [80] = { 5, 6, 7, 8 }, 279 | [81] = { 5, 6, 7, 8 }, 280 | [86] = { 5, 6, 7, 8 }, 281 | [87] = { 5, 6, 7, 8 }, 282 | [90] = { 4, 5, 6, 7 }, 283 | [91] = { 4, 5, 6, 7 }, 284 | [92] = { 4, 5, 6, 7 }, 285 | [93] = { 4, 5, 6, 7 }, 286 | }, 287 | 288 | [JOBID.JT_RANGER] = { 289 | [2] = { 0, 1, 2 }, 290 | [6] = { 0, 1, 2 }, 291 | [10] = { 0, 1, 2, 3, 4 }, 292 | [14] = { 0, 1, 2, 3, 4 }, 293 | [18] = { 0, 1, 2 }, 294 | [22] = { 0, 1, 2 }, 295 | }, 296 | 297 | [JOBID.JT_KNIGHT_H] = { 298 | [10] = { 0, 4, 5, 6, 7 }, 299 | [14] = { 0, 4, 5, 6, 7 }, 300 | [18] = { 0, 1, 2 }, 301 | [22] = { 0, 1, 2 }, 302 | [86] = { 1, 2 }, 303 | [87] = { 1, 2 }, 304 | [88] = { 0, 1, 2 }, 305 | [89] = { 0, 1, 2 }, 306 | [94] = { 0, 1, 2 }, 307 | [95] = { 0, 1, 2 }, 308 | }, 309 | 310 | [JOBID.JT_RUNE_KNIGHT] = { 311 | [2] = { 0, 1, 2 }, 312 | [6] = { 0, 1, 2 }, 313 | [10] = { 0, 1, 2, 3, 4 }, 314 | [14] = { 0, 1, 2, 3, 4 }, 315 | }, 316 | 317 | [JOBID.JT_MECHANIC] = { 318 | [2] = { 0, 1, 2 }, 319 | [6] = { 0, 1, 2 }, 320 | [10] = { 0, 1, 3, 4, 5, 6, 7 }, 321 | [14] = { 0, 1, 3, 4, 5, 6, 7 }, 322 | }, 323 | 324 | [JOBID.JT_ACOLYTE] = { 325 | [10] = { 5, 6, 7 }, 326 | [14] = { 5, 6, 7 }, 327 | [34] = { 0, 1, 2, 3, 4, 5 }, 328 | [35] = { 0, 1, 2, 3, 4, 5 }, 329 | [36] = { 0, 1, 2, 3, 4, 5 }, 330 | [37] = { 0, 1, 2, 3, 4, 5 }, 331 | [42] = { 0, 1, 2 }, 332 | [43] = { 0, 1, 2 }, 333 | [44] = { 0, 1, 2 }, 334 | [45] = { 0, 1, 2 }, 335 | }, 336 | 337 | [JOBID.JT_SORCERER] = { 338 | [2] = { 0, 1, 2 }, 339 | [6] = { 0, 1, 2 }, 340 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 341 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 342 | [18] = { 0, 1, 2 }, 343 | [22] = { 0, 1, 2 }, 344 | [42] = { 2 }, 345 | [43] = { 2 }, 346 | [44] = { 2 }, 347 | [45] = { 2 }, 348 | [82] = { 2, 3 }, 349 | [83] = { 2, 3 }, 350 | [84] = { 2, 3 }, 351 | [85] = { 2, 3 }, 352 | }, 353 | 354 | [JOBID.JT_SHADOW_CHASER] = { 355 | [2] = { 0, 1, 2 }, 356 | [6] = { 0, 1, 2 }, 357 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 358 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 359 | [18] = { 0, 1, 2 }, 360 | [22] = { 0, 1, 2 }, 361 | }, 362 | 363 | [JOBID.JT_SURA] = { 364 | [2] = { 0, 1, 2 }, 365 | [6] = { 0, 1, 2 }, 366 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 367 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 368 | [18] = { 0, 1, 2 }, 369 | [22] = { 0, 1, 2 }, 370 | [42] = { 1 }, 371 | [43] = { 1 }, 372 | [44] = { 1 }, 373 | [45] = { 1 }, 374 | }, 375 | 376 | [JOBID.JT_HUNTER_H] = { 377 | [10] = { 5, 6, 7 }, 378 | [14] = { 5, 6, 7 }, 379 | [18] = { 0, 1, 2 }, 380 | [22] = { 0, 1, 2 }, 381 | [40] = { 0, 1, 2 }, 382 | [41] = { 0, 1, 2 }, 383 | [42] = { 3, 4 }, 384 | [43] = { 3, 4 }, 385 | [44] = { 3, 4 }, 386 | [45] = { 3, 4 }, 387 | [46] = { 0, 1, 2 }, 388 | [47] = { 0, 1, 2 }, 389 | [82] = { 3, 4, 5, 6, 7, 8 }, 390 | [83] = { 3, 4, 5, 6, 7, 8 }, 391 | [84] = { 3, 4, 5, 6, 7, 8 }, 392 | [85] = { 3, 4, 5, 6, 7, 8 }, 393 | [90] = { 4 }, 394 | [91] = { 4 }, 395 | [92] = { 4 }, 396 | [93] = { 4 }, 397 | }, 398 | 399 | [JOBID.JT_ROGUE_H] = { 400 | [10] = { 4, 5, 6, 7 }, 401 | [14] = { 4, 5, 6, 7 }, 402 | [17] = { 0, 1, 2 }, 403 | [23] = { 0, 1, 2 }, 404 | [24] = { 0, 2 }, 405 | [25] = { 0, 2 }, 406 | [30] = { 0, 2 }, 407 | [31] = { 0, 2 }, 408 | [34] = { 0, 1, 2, 3, 4, 5 }, 409 | [35] = { 0, 1, 2, 3, 4, 5 }, 410 | [36] = { 0, 1, 2, 3, 4, 5 }, 411 | [37] = { 0, 1, 2, 3, 4, 5 }, 412 | [40] = { 3, 4 }, 413 | [41] = { 3, 4 }, 414 | [42] = { 0, 1, 2 }, 415 | [43] = { 0, 1, 2 }, 416 | [44] = { 0, 1, 2 }, 417 | [45] = { 0, 1, 2 }, 418 | [46] = { 3, 4 }, 419 | [47] = { 3, 4 }, 420 | [50] = { 0, 1, 2 }, 421 | [51] = { 0, 1, 2 }, 422 | [52] = { 0, 1, 2 }, 423 | [53] = { 0, 1, 2 }, 424 | [58] = { 0 }, 425 | [59] = { 0 }, 426 | [60] = { 0 }, 427 | [61] = { 0 }, 428 | [64] = { 0 }, 429 | [65] = { 0 }, 430 | [66] = { 0 }, 431 | [67] = { 0 }, 432 | [68] = { 0 }, 433 | [69] = { 0 }, 434 | [70] = { 0 }, 435 | [71] = { 0 }, 436 | [80] = { 4 }, 437 | [81] = { 4 }, 438 | [82] = { 0, 1, 2, 3 }, 439 | [83] = { 0, 1, 2, 3 }, 440 | [84] = { 0, 1, 2, 3 }, 441 | [85] = { 0, 1, 2, 3 }, 442 | [86] = { 4 }, 443 | [87] = { 4 }, 444 | [90] = { 4, 5, 6, 7 }, 445 | [91] = { 4, 5, 6, 7 }, 446 | [92] = { 4, 5, 6, 7 }, 447 | [93] = { 4, 5, 6, 7 }, 448 | [96] = { 3, 4 }, 449 | [97] = { 3, 4 }, 450 | [102] = { 3, 4 }, 451 | [103] = { 3, 4 }, 452 | }, 453 | 454 | [JOBID.JT_ARCHBISHOP] = { 455 | [10] = { 1, 4, 5, 6, 7 }, 456 | [14] = { 1, 4, 5, 6, 7 }, 457 | [18] = { 0, 1, 2 }, 458 | [22] = { 0, 1, 2 }, 459 | }, 460 | 461 | [JOBID.JT_ASSASSIN] = { 462 | [2] = { 0, 1, 2 }, 463 | [6] = { 0, 1, 2 }, 464 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 465 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 466 | [18] = { 0, 1, 2 }, 467 | [22] = { 0, 1, 2 }, 468 | [42] = { 0, 1 }, 469 | [43] = { 0, 1 }, 470 | [44] = { 0, 1 }, 471 | [45] = { 0, 1 }, 472 | [82] = { 0, 1, 2 }, 473 | [83] = { 0, 1, 2 }, 474 | [84] = { 0, 1, 2 }, 475 | [85] = { 0, 1, 2 }, 476 | [88] = { 3, 4 }, 477 | [89] = { 3, 4 }, 478 | [94] = { 3, 4 }, 479 | [95] = { 3, 4 }, 480 | }, 481 | 482 | [JOBID.JT_ASSASSIN_H] = { 483 | [18] = { 0, 1, 2 }, 484 | [22] = { 0, 1, 2 }, 485 | [42] = { 0 }, 486 | [43] = { 0 }, 487 | [44] = { 0 }, 488 | [45] = { 0 }, 489 | [82] = { 0, 1, 2, 3 }, 490 | [83] = { 0, 1, 2, 3 }, 491 | [84] = { 0, 1, 2, 3 }, 492 | [85] = { 0, 2, 3 }, 493 | }, 494 | 495 | [JOBID.JT_WARLOCK] = { 496 | [2] = { 0, 1, 2 }, 497 | [6] = { 0, 1, 2 }, 498 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 499 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 500 | [18] = { 0, 1, 2 }, 501 | [22] = { 0, 1, 2 }, 502 | [46] = { 1, 2 }, 503 | [47] = { 1, 2 }, 504 | [80] = { 0, 1, 2 }, 505 | [81] = { 0, 1, 2 }, 506 | [86] = { 0, 1, 2 }, 507 | [87] = { 0, 1, 2 }, 508 | }, 509 | 510 | [JOBID.JT_WANDERER] = { 511 | [2] = { 0, 1, 2 }, 512 | [6] = { 0, 1, 2 }, 513 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 514 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 515 | [18] = { 0, 1, 2 }, 516 | [22] = { 0, 1, 2 }, 517 | [34] = { 0, 1, 2, 3, 4, 5 }, 518 | [35] = { 0, 1, 2, 3, 4, 5 }, 519 | [36] = { 0, 1, 2, 3, 4, 5 }, 520 | [37] = { 0, 1, 2, 3, 4, 5 }, 521 | [82] = { 0, 1, 2, 3 }, 522 | [83] = { 0, 1, 2, 3 }, 523 | [84] = { 0, 1, 2, 3 }, 524 | [85] = { 0, 1, 2, 3 }, 525 | [90] = { 0, 1, 2, 3 }, 526 | [91] = { 0, 1, 2, 3 }, 527 | [92] = { 0, 1, 2, 3 }, 528 | [93] = { 0, 1, 2, 3 }, 529 | [98] = { 1, 2, 3 }, 530 | [99] = { 1, 2, 3 }, 531 | [100] = { 1, 2, 3 }, 532 | [101] = { 1, 2, 3 }, 533 | }, 534 | 535 | [JOBID.JT_WIZARD] = { 536 | [2] = { 0, 1, 2 }, 537 | [6] = { 0, 1, 2 }, 538 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 539 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 540 | [18] = { 0, 1, 2 }, 541 | [22] = { 0, 1, 2 }, 542 | [40] = { 2, 3 }, 543 | [41] = { 2, 3 }, 544 | [46] = { 2, 3 }, 545 | [47] = { 2, 3 }, 546 | [80] = { 3 }, 547 | [81] = { 3 }, 548 | [86] = { 3 }, 549 | [87] = { 3 }, 550 | }, 551 | 552 | [JOBID.JT_GENETIC] = { 553 | [2] = { 0, 1, 2 }, 554 | [6] = { 0, 1, 2 }, 555 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 556 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 557 | [18] = { 0, 1, 2 }, 558 | [22] = { 0, 1, 2 }, 559 | }, 560 | 561 | [JOBID.JT_BLACKSMITH] = { 562 | 563 | }, 564 | 565 | [JOBID.JT_DANCER_H] = { 566 | [10] = { 1, 2, 3, 4, 5, 6 }, 567 | [14] = { 1, 2, 3, 4, 5, 6 }, 568 | [18] = { 0, 1, 2 }, 569 | [22] = { 0, 1, 2 }, 570 | [40] = { 3, 4 }, 571 | [41] = { 3, 4 }, 572 | [46] = { 3, 4 }, 573 | [47] = { 3, 4 }, 574 | [48] = { 0, 1, 2 }, 575 | [49] = { 0, 1, 2 }, 576 | [54] = { 0, 1, 2 }, 577 | [55] = { 0, 1, 2 }, 578 | [56] = { 0 }, 579 | [57] = { 0 }, 580 | [62] = { 0 }, 581 | [63] = { 0 }, 582 | [80] = { 5, 6, 7, 8 }, 583 | [81] = { 5, 6, 7, 8 }, 584 | [86] = { 5, 6, 7, 8 }, 585 | [87] = { 5, 6, 7, 8 }, 586 | }, 587 | 588 | [JOBID.JT_MONK_H] = { 589 | [10] = { 4, 5, 6, 7 }, 590 | [14] = { 4, 5, 6, 7 }, 591 | [42] = { 2 }, 592 | [43] = { 2 }, 593 | [44] = { 2 }, 594 | [45] = { 2 }, 595 | }, 596 | 597 | [JOBID.JT_CRUSADER] = { 598 | [90] = { 0, 1, 2, 3, 4, 5 }, 599 | [91] = { 0, 1, 2, 3, 4, 5 }, 600 | [92] = { 0, 1, 2, 3, 4, 5 }, 601 | [93] = { 0, 1, 2, 3, 4, 5 }, 602 | }, 603 | 604 | [JOBID.JT_ALCHEMIST_H] = { 605 | [10] = { 5, 6, 7 }, 606 | [14] = { 5, 6, 7 }, 607 | [34] = { 0, 1, 2, 3, 4, 5 }, 608 | [35] = { 0, 1, 2, 3, 4, 5 }, 609 | [36] = { 0, 1, 2, 3, 4, 5 }, 610 | [37] = { 0, 1, 2, 3, 4, 5 }, 611 | [48] = { 0, 1, 2 }, 612 | [49] = { 0, 1, 2 }, 613 | [54] = { 0, 1, 2 }, 614 | [55] = { 0, 1, 2 }, 615 | [56] = { 0 }, 616 | [57] = { 0 }, 617 | [62] = { 0 }, 618 | [63] = { 0 }, 619 | [64] = { 0 }, 620 | [65] = { 0 }, 621 | [66] = { 0 }, 622 | [67] = { 0 }, 623 | [68] = { 0 }, 624 | [69] = { 0 }, 625 | [70] = { 0 }, 626 | [71] = { 0 }, 627 | [80] = { 7, 8 }, 628 | [81] = { 7, 8 }, 629 | [82] = { 0, 1, 2, 3, 4, 5, 6 }, 630 | [83] = { 0, 1, 2, 3, 4, 5, 6 }, 631 | [84] = { 0, 1, 2, 3, 4, 5, 6 }, 632 | [85] = { 0, 1, 2, 3, 4, 5, 6 }, 633 | [86] = { 7, 8 }, 634 | [87] = { 7, 8 }, 635 | }, 636 | 637 | [JOBID.JT_TAEKWON] = { 638 | [2] = { 0, 1, 2 }, 639 | [6] = { 0, 1, 2 }, 640 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 641 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 642 | [18] = { 0, 1, 2 }, 643 | [22] = { 0, 1, 2 }, 644 | [88] = { 4, 6 }, 645 | [89] = { 4, 6 }, 646 | [90] = { 4 }, 647 | [91] = { 4 }, 648 | [92] = { 4 }, 649 | [93] = { 4 }, 650 | [94] = { 4, 6 }, 651 | [95] = { 4, 6 }, 652 | }, 653 | 654 | [JOBID.JT_CHICKEN] = { 655 | 656 | }, 657 | 658 | [JOBID.JT_SAGE_H] = { 659 | [2] = { 0, 1, 2 }, 660 | [6] = { 0, 1, 2 }, 661 | [10] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 662 | [14] = { 0, 1, 2, 3, 4, 5, 6, 7 }, 663 | [18] = { 0, 1, 2 }, 664 | [22] = { 0, 1, 2 }, 665 | [32] = { 0, 1, 2, 3, 4, 5 }, 666 | [33] = { 0, 1, 2, 3, 4, 5 }, 667 | [34] = { 0, 1, 2, 3, 4, 5 }, 668 | [35] = { 0, 1, 2, 3, 4, 5 }, 669 | [36] = { 0, 1, 2, 3, 4, 5 }, 670 | [37] = { 0, 1, 2, 3, 4, 5 }, 671 | [38] = { 0, 1, 2, 3, 4, 5 }, 672 | [39] = { 0, 1, 2, 3, 4, 5 }, 673 | [40] = { 0, 1, 2, 3, 4 }, 674 | [41] = { 0, 1, 2, 3, 4 }, 675 | [42] = { 2 }, 676 | [43] = { 2 }, 677 | [44] = { 2 }, 678 | [45] = { 2 }, 679 | [46] = { 2 }, 680 | [47] = { 2 }, 681 | [48] = { 0, 1, 2 }, 682 | [49] = { 0, 1, 2 }, 683 | [54] = { 0, 1, 2 }, 684 | [55] = { 0, 1, 2 }, 685 | [56] = { 0 }, 686 | [57] = { 0 }, 687 | [62] = { 0 }, 688 | [63] = { 0 }, 689 | [64] = { 0 }, 690 | [65] = { 0 }, 691 | [66] = { 0 }, 692 | [67] = { 0 }, 693 | [68] = { 0 }, 694 | [69] = { 0 }, 695 | [70] = { 0 }, 696 | [71] = { 0 }, 697 | [72] = { 0 }, 698 | [73] = { 0 }, 699 | [74] = { 0 }, 700 | [75] = { 0 }, 701 | [76] = { 0 }, 702 | [77] = { 0 }, 703 | [78] = { 0 }, 704 | [79] = { 0 }, 705 | [80] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 706 | [81] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 707 | [86] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 708 | [87] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, 709 | [88] = { 0, 3, 4, 5, 6, 7 }, 710 | [89] = { 0, 3, 4, 5, 6, 7 }, 711 | [94] = { 0, 3, 4, 5, 6, 7 }, 712 | [95] = { 0, 3, 4, 5, 6, 7 }, 713 | [96] = { 0, 1, 2 }, 714 | [97] = { 0, 1, 2 }, 715 | [102] = { 0, 1, 2 }, 716 | [103] = { 0, 1, 2 }, 717 | }, 718 | 719 | [JOBID.JT_PRIEST] = { 720 | [2] = { 0, 1, 2 }, 721 | [6] = { 0, 1, 2 }, 722 | [10] = { 2 }, 723 | [14] = { 2 }, 724 | [18] = { 0, 1, 2 }, 725 | [22] = { 0, 1, 2 }, 726 | [42] = { 0 }, 727 | [43] = { 0 }, 728 | [44] = { 0 }, 729 | [45] = { 0 }, 730 | [80] = { 4, 5, 6, 7, 8 }, 731 | [81] = { 4, 5, 6, 7, 8 }, 732 | [82] = { 0, 1, 2, 3 }, 733 | [83] = { 0, 1, 2, 3 }, 734 | [84] = { 0, 1, 2, 3 }, 735 | [85] = { 0, 1, 2, 3 }, 736 | [86] = { 4, 5, 6, 7, 8 }, 737 | [87] = { 4, 5, 6, 7, 8 }, 738 | [88] = { 4, 5, 6, 7 }, 739 | [89] = { 4, 5, 6, 7 }, 740 | [90] = { 0, 1, 2, 3 }, 741 | [91] = { 0, 1, 2, 3 }, 742 | [92] = { 0, 1, 2, 3 }, 743 | [93] = { 0, 1, 2, 3 }, 744 | [94] = { 4, 5, 6, 7 }, 745 | [95] = { 4, 5, 6, 7 }, 746 | }, 747 | 748 | [JOBID.JT_WIZARD_H] = { 749 | 750 | }, 751 | 752 | [JOBID.JT_PRIEST_H] = { 753 | [10] = { 0, 4, 5, 6, 7 }, 754 | [14] = { 0, 4, 5, 6, 7 }, 755 | [42] = { 1 }, 756 | [43] = { 1 }, 757 | [44] = { 1 }, 758 | [45] = { 1 }, 759 | [80] = { 4, 5, 6, 7, 8 }, 760 | [81] = { 4, 5, 6, 7, 8 }, 761 | [82] = { 0 }, 762 | [83] = { 0 }, 763 | [84] = { 0 }, 764 | [85] = { 0 }, 765 | [86] = { 4, 5, 6, 7, 8 }, 766 | [87] = { 4, 5, 6, 7, 8 }, 767 | [88] = { 4, 5, 6, 7 }, 768 | [89] = { 4, 5, 6, 7 }, 769 | [90] = { 0 }, 770 | [91] = { 0 }, 771 | [92] = { 0 }, 772 | [93] = { 0 }, 773 | [94] = { 4, 5, 6, 7 }, 774 | [95] = { 4, 5, 6, 7 }, 775 | }, 776 | 777 | [JOBID.JT_BLACKSMITH_H] = { 778 | [10] = { 0, 1, 2, 7 }, 779 | [14] = { 0, 1, 2, 7 }, 780 | [80] = { 6, 7, 8 }, 781 | [81] = { 6, 7, 8 }, 782 | [86] = { 6, 7, 8 }, 783 | [87] = { 6, 7, 8 }, 784 | }, 785 | 786 | [JOBID.JT_OBORO] = { 787 | [10] = { 4, 5, 6, 7 }, 788 | [14] = { 4, 5, 6, 7 }, 789 | [90] = { 1, 2, 3, 4 }, 790 | [91] = { 1, 2, 3, 4 }, 791 | [92] = { 1, 2, 3, 4 }, 792 | [93] = { 1, 2, 3, 4 }, 793 | }, 794 | } -------------------------------------------------------------------------------- /db/small_M.robe.php: -------------------------------------------------------------------------------- 1 | array( 12 | 18 => array( 0, 1, 2 ), 13 | 22 => array( 0, 1, 2 ) 14 | ), 15 | 16 | 24 => array( 17 | 2 => array( 0, 1, 2 ), 18 | 6 => array( 0, 1, 2 ), 19 | 10 => array( 0, 1, 2, 3, 4 ), 20 | 14 => array( 0, 1, 2, 3, 4 ) 21 | ), 22 | 23 | 1 => array( 24 | 10 => array( 0, 4, 5, 6, 7 ), 25 | 14 => array( 0, 4, 5, 6, 7 ), 26 | 18 => array( 0, 1, 2 ), 27 | 22 => array( 0, 1, 2 ), 28 | 34 => array( 0, 1, 2, 3, 4, 5 ), 29 | 35 => array( 0, 1, 2, 3, 4, 5 ), 30 | 36 => array( 0, 1, 2, 3, 4, 5 ), 31 | 37 => array( 0, 1, 2, 3, 4, 5 ), 32 | 42 => array( 0, 1 ), 33 | 43 => array( 0, 1 ), 34 | 44 => array( 0, 1 ), 35 | 45 => array( 0, 1 ), 36 | 82 => array( 0, 1, 2, 3, 4 ), 37 | 83 => array( 0, 1, 2, 3, 4 ), 38 | 84 => array( 0, 1, 2, 3, 4 ), 39 | 85 => array( 0, 1, 2, 3, 4 ), 40 | 90 => array( 0, 1, 2, 3, 4 ), 41 | 91 => array( 0, 1, 2, 3, 4 ), 42 | 92 => array( 0, 1, 2, 3, 4 ), 43 | 93 => array( 0, 1, 2, 3, 4 ), 44 | 98 => array( 0, 1, 2, 3, 4, 5 ), 45 | 99 => array( 0, 1, 2, 3, 4, 5 ), 46 | 100 => array( 0, 1, 2, 3, 4, 5 ), 47 | 101 => array( 0, 1, 2, 3, 4, 5 ) 48 | ), 49 | 50 | 22 => array( 51 | 2 => array( 0, 1, 2 ), 52 | 6 => array( 0, 1, 2 ), 53 | 10 => array( 0, 1, 2, 6, 7 ), 54 | 14 => array( 0, 1, 2, 6, 7 ) 55 | ), 56 | 57 | 3 => array( 58 | 10 => array( 0, 5, 7, 8 ), 59 | 14 => array( 0, 5, 7, 8 ), 60 | 32 => array( 0, 1, 2, 3, 4, 5 ), 61 | 33 => array( 0, 1, 2, 3, 4, 5 ), 62 | 34 => array( 0, 1, 2, 3, 4, 5 ), 63 | 35 => array( 0, 1, 2, 3, 4, 5 ), 64 | 36 => array( 0, 1, 2, 3, 4, 5 ), 65 | 37 => array( 0, 1, 2, 3, 4, 5 ), 66 | 38 => array( 0, 1, 2, 3, 4, 5 ), 67 | 39 => array( 0, 1, 2, 3, 4, 5 ), 68 | 40 => array( 0, 1 ), 69 | 41 => array( 0, 1 ), 70 | 42 => array( 0, 1 ), 71 | 43 => array( 0, 1 ), 72 | 44 => array( 0, 1 ), 73 | 45 => array( 0, 1 ), 74 | 46 => array( 0, 1 ), 75 | 47 => array( 0, 1 ), 76 | 48 => array( 0, 1, 2 ), 77 | 49 => array( 0, 1, 2 ), 78 | 50 => array( 0, 1, 2 ), 79 | 51 => array( 0, 1, 2 ), 80 | 52 => array( 0, 1, 2 ), 81 | 53 => array( 0, 1, 2 ), 82 | 54 => array( 0, 1, 2 ), 83 | 55 => array( 0, 1, 2 ), 84 | 56 => array( 0 ), 85 | 57 => array( 0 ), 86 | 58 => array( 0 ), 87 | 59 => array( 0 ), 88 | 60 => array( 0 ), 89 | 61 => array( 0 ), 90 | 62 => array( 0 ), 91 | 63 => array( 0 ), 92 | 72 => array( 0 ), 93 | 73 => array( 0 ), 94 | 74 => array( 0 ), 95 | 75 => array( 0 ), 96 | 76 => array( 0 ), 97 | 77 => array( 0 ), 98 | 78 => array( 0 ), 99 | 79 => array( 0 ), 100 | 82 => array( 3, 4, 5, 6, 7, 8 ), 101 | 83 => array( 3, 4, 5, 6, 7, 8 ), 102 | 84 => array( 3, 4, 5, 6, 7, 8 ), 103 | 85 => array( 3, 4, 5, 6, 7, 8 ), 104 | 90 => array( 0, 1, 2, 3 ), 105 | 91 => array( 0, 1, 2, 3 ), 106 | 92 => array( 0, 1, 2, 3 ), 107 | 93 => array( 0, 1, 2, 3 ), 108 | 96 => array( 0, 1, 2, 3, 4, 5 ), 109 | 97 => array( 0, 1, 2, 3, 4, 5 ), 110 | 98 => array( 0, 1, 2, 3, 4, 5 ), 111 | 99 => array( 0, 1, 2, 3, 4, 5 ), 112 | 100 => array( 0, 1, 2, 3, 4, 5 ), 113 | 101 => array( 0, 1, 2, 3, 4, 5 ), 114 | 102 => array( 0, 1, 2, 3, 4, 5 ), 115 | 103 => array( 0, 1, 2, 3, 4, 5 ) 116 | ), 117 | 118 | 4047 => array( 119 | 10 => array( 5, 6, 7 ), 120 | 14 => array( 5, 6, 7 ) 121 | ), 122 | 123 | 4048 => array( 124 | 2 => array( 0, 1, 2 ), 125 | 6 => array( 0, 1, 2 ), 126 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 127 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ) 128 | ), 129 | 130 | 4082 => array( 131 | 2 => array( 0, 1, 2 ), 132 | 6 => array( 0, 1, 2 ), 133 | 10 => array( 4, 5, 6, 7 ), 134 | 14 => array( 4, 5, 6, 7 ), 135 | 18 => array( 0, 1, 2 ), 136 | 22 => array( 0, 1, 2 ) 137 | ), 138 | 139 | 7 => array( 140 | 2 => array( 0, 1, 2 ), 141 | 6 => array( 0, 1, 2 ), 142 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 143 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 144 | 18 => array( 0, 1, 2 ), 145 | 22 => array( 0, 1, 2 ), 146 | 32 => array( 0, 1, 2 ), 147 | 33 => array( 0, 1, 2 ), 148 | 38 => array( 0, 1, 2, 3, 4, 5 ), 149 | 39 => array( 0, 1, 2, 3, 4, 5 ), 150 | 40 => array( 3, 4 ), 151 | 41 => array( 3, 4 ), 152 | 46 => array( 3, 4 ), 153 | 47 => array( 3, 4 ), 154 | 82 => array( 6, 7, 8 ), 155 | 83 => array( 6, 7, 8 ), 156 | 84 => array( 6, 7, 8 ), 157 | 85 => array( 6, 7, 8 ), 158 | 98 => array( 0, 1, 2, 3, 4, 5 ), 159 | 99 => array( 0, 1, 2, 3, 4, 5 ), 160 | 100 => array( 0, 1, 2, 3, 4, 5 ), 161 | 101 => array( 0, 1, 2, 3, 4, 5 ) 162 | ), 163 | 164 | 4059 => array( 165 | 2 => array( 0, 1, 2 ), 166 | 6 => array( 0, 1, 2 ), 167 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 168 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 169 | 18 => array( 0, 1, 2 ), 170 | 22 => array( 0, 1, 2 ) 171 | ), 172 | 173 | 25 => array( 174 | 10 => array( 7, 8 ), 175 | 14 => array( 7, 8 ) 176 | ), 177 | 178 | 6 => array( 179 | 2 => array( 0, 1, 2 ), 180 | 6 => array( 0, 1, 2 ), 181 | 10 => array( 0, 5, 6, 7 ), 182 | 14 => array( 0, 5, 6, 7 ), 183 | 18 => array( 0, 1, 2 ), 184 | 22 => array( 0, 1, 2 ), 185 | 88 => array( 0, 1 ), 186 | 89 => array( 0, 1 ), 187 | 94 => array( 0, 1 ), 188 | 95 => array( 0, 1 ) 189 | ), 190 | 191 | 4056 => array( 192 | 2 => array( 0, 1, 2 ), 193 | 6 => array( 0, 1, 2 ), 194 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 195 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 196 | 18 => array( 0, 1, 2 ), 197 | 22 => array( 0, 1, 2 ) 198 | ), 199 | 200 | 17 => array( 201 | 2 => array( 0, 1, 2 ), 202 | 6 => array( 0, 1, 2 ), 203 | 10 => array( 0, 4, 5, 6, 7 ), 204 | 14 => array( 0, 4, 5, 6, 7 ), 205 | 18 => array( 0, 1, 2 ), 206 | 22 => array( 0, 1, 2 ), 207 | 42 => array( 1, 2 ), 208 | 43 => array( 1, 2 ), 209 | 44 => array( 1, 2 ), 210 | 45 => array( 1, 2 ), 211 | 82 => array( 5, 6, 7, 8 ), 212 | 83 => array( 5, 6, 7, 8 ), 213 | 84 => array( 5, 6, 7, 8 ), 214 | 85 => array( 5, 6, 7, 8 ), 215 | 88 => array( 0, 1 ), 216 | 89 => array( 0, 1 ), 217 | 94 => array( 0, 1 ), 218 | 95 => array( 0, 1 ) 219 | ), 220 | 221 | 4008 => array( 222 | 2 => array( 0, 1, 2 ), 223 | 6 => array( 0, 1, 2 ), 224 | 10 => array( 0, 4, 5, 6, 7 ), 225 | 14 => array( 0, 4, 5, 6, 7 ), 226 | 18 => array( 0, 1, 2 ), 227 | 22 => array( 0, 1, 2 ), 228 | 32 => array( 0, 1, 2, 3, 4, 5 ), 229 | 33 => array( 0, 1, 2, 3, 4, 5 ), 230 | 38 => array( 0, 1, 2, 3, 4, 5 ), 231 | 39 => array( 0, 1, 2, 3, 4, 5 ), 232 | 82 => array( 6 ), 233 | 83 => array( 6 ), 234 | 84 => array( 6 ), 235 | 85 => array( 6 ), 236 | 99 => array( 0, 1, 2, 3, 4, 5 ), 237 | 100 => array( 0, 1, 2, 3, 4, 5 ), 238 | 101 => array( 0, 1, 2, 3, 4, 5 ) 239 | ), 240 | 241 | 4054 => array( 242 | 2 => array( 0, 1, 2 ), 243 | 6 => array( 0, 1, 2 ), 244 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 245 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ) 246 | ), 247 | 248 | 15 => array( 249 | 10 => array( 5, 6, 7 ), 250 | 14 => array( 5, 6, 7 ), 251 | 82 => array( 2, 3, 4, 5 ), 252 | 83 => array( 2, 3, 4, 5 ), 253 | 84 => array( 2, 3, 4, 5 ), 254 | 85 => array( 2, 3, 4, 5 ), 255 | 90 => array( 2, 3, 4 ), 256 | 91 => array( 2, 3, 4 ), 257 | 92 => array( 2, 3, 4 ), 258 | 93 => array( 2, 3, 4 ), 259 | 96 => array( 0, 1, 3, 5 ), 260 | 97 => array( 0, 1, 3, 5 ), 261 | 98 => array( 1, 3 ), 262 | 99 => array( 1, 3 ), 263 | 100 => array( 1, 3 ), 264 | 101 => array( 1, 3 ), 265 | 102 => array( 0, 1, 3, 5 ), 266 | 103 => array( 0, 1, 3, 5 ) 267 | ), 268 | 269 | 4058 => array( 270 | 10 => array( 5, 6, 7 ), 271 | 14 => array( 5, 6, 7 ) 272 | ), 273 | 274 | 4068 => array( 275 | 18 => array( 0, 1, 2 ), 276 | 22 => array( 0, 1, 2 ) 277 | ), 278 | 279 | 19 => array( 280 | 10 => array( 5, 6, 7 ), 281 | 14 => array( 5, 6, 7 ), 282 | 90 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 283 | 91 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 284 | 92 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 285 | 93 => array( 0, 1, 2, 3, 4, 5, 6, 7 ) 286 | ), 287 | 288 | 5 => array( 289 | 10 => array( 0, 1, 2, 7 ), 290 | 14 => array( 0, 1, 2, 7 ) 291 | ), 292 | 293 | 4 => array( 294 | 10 => array( 5, 6, 7 ), 295 | 14 => array( 5, 6, 7 ) 296 | ), 297 | 298 | 16 => array( 299 | 2 => array( 0, 1, 2 ), 300 | 6 => array( 0, 1, 2 ), 301 | 10 => array( 0, 4, 5, 6, 7 ), 302 | 14 => array( 0, 4, 5, 6, 7 ), 303 | 88 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 304 | 89 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 305 | 90 => array( 0, 1, 2, 3, 4 ), 306 | 91 => array( 0, 1, 2, 3, 4 ), 307 | 92 => array( 0, 1, 2, 3, 4 ), 308 | 93 => array( 0, 1, 2, 3, 4 ), 309 | 94 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 310 | 95 => array( 0, 1, 2, 3, 4, 5, 6, 7 ) 311 | ), 312 | 313 | 4067 => array( 314 | 2 => array( 0, 1, 2 ), 315 | 6 => array( 0, 1, 2 ), 316 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 317 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 318 | 18 => array( 0, 1, 2 ), 319 | 22 => array( 0, 1, 2 ) 320 | ), 321 | 322 | 4049 => array( 323 | 2 => array( 0, 1, 2 ), 324 | 6 => array( 0, 1, 2 ), 325 | 10 => array( 0, 1, 2, 3, 4, 5, 7 ), 326 | 14 => array( 0, 1, 2, 3, 4, 5, 7 ), 327 | 18 => array( 0, 1, 2 ), 328 | 22 => array( 0, 1, 2 ) 329 | ), 330 | 331 | 4072 => array( 332 | 2 => array( 0, 1, 2 ), 333 | 6 => array( 0, 1, 2 ), 334 | 42 => array( 1, 2 ), 335 | 43 => array( 1, 2 ), 336 | 44 => array( 1, 2 ), 337 | 45 => array( 1, 2 ) 338 | ), 339 | 340 | 4070 => array( 341 | 2 => array( 0, 1, 2 ), 342 | 6 => array( 0, 1, 2 ), 343 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 344 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 345 | 18 => array( 0, 1, 2 ), 346 | 22 => array( 0, 1, 2 ), 347 | 82 => array( 1, 2, 3, 4 ), 348 | 83 => array( 1, 2, 3, 4 ), 349 | 84 => array( 1, 2, 3, 4 ), 350 | 85 => array( 1, 2, 3, 4 ), 351 | 90 => array( 1, 2, 3, 4 ), 352 | 91 => array( 1, 2, 3, 4 ), 353 | 92 => array( 1, 2, 3, 4 ), 354 | 93 => array( 1, 2, 3, 4 ) 355 | ), 356 | 357 | 4012 => array( 358 | 10 => array( 5, 6, 7 ), 359 | 14 => array( 5, 6, 7 ), 360 | 41 => array( 1, 2 ), 361 | 46 => array( 1, 2 ), 362 | 47 => array( 1, 2 ), 363 | 80 => array( 1, 2, 3, 4 ), 364 | 81 => array( 1, 2, 3, 4 ), 365 | 86 => array( 1, 2, 3, 4 ), 366 | 87 => array( 1, 2, 3, 4 ), 367 | 94 => array( 4 ), 368 | 95 => array( 4 ), 369 | 102 => array( 4 ), 370 | 103 => array( 4 ) 371 | ), 372 | 373 | 4018 => array( 374 | 2 => array( 0, 1, 2 ), 375 | 6 => array( 0, 1, 2 ), 376 | 10 => array( 5, 6, 7 ), 377 | 14 => array( 5, 6, 7 ), 378 | 17 => array( 0, 1, 2 ), 379 | 23 => array( 0, 1, 2 ), 380 | 40 => array( 1, 2 ), 381 | 41 => array( 1, 2 ), 382 | 42 => array( 1, 2 ), 383 | 43 => array( 1, 2 ), 384 | 44 => array( 1, 2 ), 385 | 45 => array( 1, 2 ), 386 | 46 => array( 1, 2 ), 387 | 47 => array( 1, 2 ), 388 | 64 => array( 0 ), 389 | 65 => array( 0 ), 390 | 66 => array( 0 ), 391 | 67 => array( 0 ), 392 | 68 => array( 0 ), 393 | 69 => array( 0 ), 394 | 70 => array( 0 ), 395 | 71 => array( 0 ), 396 | 80 => array( 5, 6, 7, 8 ), 397 | 81 => array( 5, 6, 7, 8 ), 398 | 82 => array( 5, 6, 7, 8 ), 399 | 83 => array( 5, 6, 7, 8 ), 400 | 84 => array( 5, 6, 7, 8 ), 401 | 85 => array( 5, 6, 7, 8 ), 402 | 86 => array( 5, 6, 7, 8 ), 403 | 87 => array( 5, 6, 7, 8 ), 404 | 88 => array( 0, 1 ), 405 | 89 => array( 0, 1 ), 406 | 94 => array( 0, 1 ), 407 | 95 => array( 0, 1 ) 408 | ), 409 | 410 | 4057 => array( 411 | 2 => array( 0, 1, 2 ), 412 | 6 => array( 0, 1, 2 ), 413 | 10 => array( 0, 1, 3, 4, 5, 6, 7 ), 414 | 14 => array( 0, 1, 3, 4, 5, 6, 7 ), 415 | 18 => array( 0, 1, 2 ), 416 | 22 => array( 0, 1, 2 ) 417 | ), 418 | 419 | 18 => array( 420 | 10 => array( 5, 6, 7 ), 421 | 14 => array( 5, 6, 7 ), 422 | 40 => array( 3, 4 ), 423 | 41 => array( 3, 4 ), 424 | 46 => array( 3, 4 ), 425 | 47 => array( 3, 4 ), 426 | 88 => array( 5, 6, 7 ), 427 | 89 => array( 5, 6, 7 ), 428 | 90 => array( 4 ), 429 | 91 => array( 4 ), 430 | 92 => array( 4 ), 431 | 93 => array( 4 ), 432 | 94 => array( 5, 6, 7 ), 433 | 95 => array( 5, 6, 7 ) 434 | ), 435 | 436 | 12 => array( 437 | 2 => array( 0, 1, 2 ), 438 | 6 => array( 0, 1, 2 ), 439 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 440 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 441 | 40 => array( 1 ), 442 | 41 => array( 1 ), 443 | 46 => array( 1 ), 444 | 47 => array( 1 ), 445 | 48 => array( 0, 1, 2 ), 446 | 49 => array( 0, 1, 2 ), 447 | 54 => array( 0, 1, 2 ), 448 | 55 => array( 0, 1, 2 ), 449 | 56 => array( 0 ), 450 | 57 => array( 0 ), 451 | 62 => array( 0 ), 452 | 63 => array( 0 ), 453 | 80 => array( 2, 3 ), 454 | 81 => array( 2, 3 ), 455 | 86 => array( 2, 3 ), 456 | 87 => array( 2, 3 ), 457 | 88 => array( 1, 2, 6, 7 ), 458 | 89 => array( 1, 2, 6, 7 ), 459 | 94 => array( 1, 2, 6, 7 ), 460 | 95 => array( 1, 2, 6, 7 ), 461 | 96 => array( 1 ), 462 | 97 => array( 1 ), 463 | 102 => array( 1 ), 464 | 103 => array( 1 ) 465 | ), 466 | 467 | 4013 => array( 468 | 10 => array( 1, 2, 3 ), 469 | 14 => array( 1, 2, 3 ), 470 | 80 => array( 3 ), 471 | 81 => array( 3 ), 472 | 86 => array( 2, 3 ), 473 | 87 => array( 2, 3 ), 474 | 88 => array( 2 ), 475 | 89 => array( 2 ), 476 | 94 => array( 6, 7 ), 477 | 95 => array( 6, 7 ) 478 | ), 479 | 480 | 27 => array( 481 | 10 => array( 4, 5, 6 ), 482 | 14 => array( 4, 5, 6 ), 483 | 18 => array( 0, 1, 2 ), 484 | 22 => array( 0, 1, 2 ) 485 | ), 486 | 487 | 4055 => array( 488 | 2 => array( 0, 1, 2 ), 489 | 6 => array( 0, 1, 2 ), 490 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 491 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 492 | 18 => array( 0, 1, 2 ), 493 | 22 => array( 0, 1, 2 ) 494 | ), 495 | 496 | 9 => array( 497 | 10 => array( 1, 2, 3, 4 ), 498 | 14 => array( 1, 2, 3, 4 ), 499 | 80 => array( 1, 2, 3 ), 500 | 81 => array( 1, 2, 3 ), 501 | 86 => array( 1, 2, 3 ), 502 | 87 => array( 1, 2, 3 ) 503 | ), 504 | 505 | 4071 => array( 506 | 2 => array( 0, 1, 2 ), 507 | 6 => array( 0, 1, 2 ), 508 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 509 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 510 | 18 => array( 0, 1, 2 ), 511 | 22 => array( 0, 1, 2 ) 512 | ), 513 | 514 | 10 => array( 515 | ), 516 | 517 | 4016 => array( 518 | 10 => array( 5, 6, 7 ), 519 | 14 => array( 5, 6, 7 ), 520 | 18 => array( 0, 1, 2 ), 521 | 22 => array( 0, 1, 2 ), 522 | 82 => array( 2, 3, 4, 5 ), 523 | 83 => array( 2, 3, 4, 5 ), 524 | 84 => array( 2, 3, 4, 5 ), 525 | 85 => array( 2, 3, 4, 5 ), 526 | 90 => array( 2, 3, 4 ), 527 | 91 => array( 2, 3, 4 ), 528 | 92 => array( 2, 3, 4 ), 529 | 93 => array( 2, 3, 4 ) 530 | ), 531 | 532 | 0 => array( 533 | 90 => array( 1, 2, 3 ), 534 | 91 => array( 1, 2, 3 ), 535 | 92 => array( 1, 2, 3 ), 536 | 93 => array( 1, 2, 3 ) 537 | ), 538 | 539 | 4019 => array( 540 | 10 => array( 5, 6, 7 ), 541 | 14 => array( 5, 6, 7 ), 542 | 32 => array( 0, 1, 2, 3, 4, 5 ), 543 | 33 => array( 0, 1, 2, 3, 4, 5 ), 544 | 34 => array( 0, 1, 2, 3, 4, 5 ), 545 | 35 => array( 0, 1, 2, 3, 4, 5 ), 546 | 36 => array( 0, 1, 2, 3, 4, 5 ), 547 | 37 => array( 0, 1, 2, 3, 4, 5 ), 548 | 38 => array( 0, 1, 2, 3, 4, 5 ), 549 | 39 => array( 0, 1, 2, 3, 4, 5 ), 550 | 40 => array( 0 ), 551 | 41 => array( 0 ), 552 | 42 => array( 0, 1, 2 ), 553 | 43 => array( 0, 1, 2 ), 554 | 44 => array( 0, 1, 2 ), 555 | 45 => array( 0, 1, 2 ), 556 | 46 => array( 0 ), 557 | 47 => array( 0 ), 558 | 48 => array( 0, 1, 2 ), 559 | 49 => array( 0, 1, 2 ), 560 | 54 => array( 0, 1, 2 ), 561 | 55 => array( 0, 1, 2 ), 562 | 56 => array( 0 ), 563 | 57 => array( 0 ), 564 | 62 => array( 0 ), 565 | 63 => array( 0 ), 566 | 80 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 567 | 81 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 568 | 86 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 569 | 87 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 570 | 88 => array( 0, 1, 2, 3, 4, 6, 7 ), 571 | 89 => array( 0, 1, 2, 3, 4, 6, 7 ), 572 | 94 => array( 0, 1, 2, 3, 4, 6, 7 ), 573 | 95 => array( 0, 1, 2, 3, 4, 6, 7 ), 574 | 96 => array( 0, 1, 2, 3, 4, 5 ), 575 | 97 => array( 0, 1, 2, 3, 4, 5 ), 576 | 102 => array( 0, 1, 2, 3, 4, 5 ), 577 | 103 => array( 0, 1, 2, 3, 4, 5 ) 578 | ), 579 | 580 | 4020 => array( 581 | 2 => array( 0, 1, 2 ), 582 | 6 => array( 0, 1, 2 ), 583 | 10 => array( 4, 5, 6, 7 ), 584 | 14 => array( 4, 5, 6, 7 ), 585 | 42 => array( 1, 2 ), 586 | 43 => array( 1, 2 ), 587 | 44 => array( 1, 2 ), 588 | 45 => array( 1, 2 ), 589 | 48 => array( 0, 1, 2 ), 590 | 49 => array( 0, 1, 2 ), 591 | 54 => array( 0, 1, 2 ), 592 | 55 => array( 0, 1, 2 ), 593 | 56 => array( 0 ), 594 | 57 => array( 0 ), 595 | 62 => array( 0 ), 596 | 63 => array( 0 ), 597 | 64 => array( 0 ), 598 | 65 => array( 0 ), 599 | 66 => array( 0 ), 600 | 67 => array( 0 ), 601 | 68 => array( 0 ), 602 | 69 => array( 0 ), 603 | 70 => array( 0 ), 604 | 80 => array( 4, 5, 6, 7, 8 ), 605 | 81 => array( 4, 5, 6, 7, 8 ), 606 | 86 => array( 4, 5, 6, 7, 8 ), 607 | 87 => array( 4, 5, 6, 7, 8 ), 608 | 90 => array( 3, 4, 5, 6, 7 ), 609 | 91 => array( 3, 4, 5, 6, 7 ), 610 | 92 => array( 3, 4, 5, 6, 7 ), 611 | 93 => array( 3, 4, 5, 6, 7 ) 612 | ), 613 | 614 | 4046 => array( 615 | 10 => array( 4, 5, 6, 7 ), 616 | 14 => array( 4, 5, 6, 7 ) 617 | ), 618 | 619 | 13 => array( 620 | ), 621 | 622 | 4017 => array( 623 | 2 => array( 0, 1, 2 ), 624 | 6 => array( 0, 1, 2 ), 625 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 626 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 627 | 18 => array( 0, 1, 2 ), 628 | 22 => array( 0, 1, 2 ), 629 | 40 => array( 1, 2, 3, 4 ), 630 | 41 => array( 1, 2, 3, 4 ), 631 | 46 => array( 1, 2, 3, 4 ), 632 | 47 => array( 1, 2, 3, 4 ), 633 | 64 => array( 0 ), 634 | 65 => array( 0 ), 635 | 66 => array( 0 ), 636 | 67 => array( 0 ), 637 | 68 => array( 0 ), 638 | 69 => array( 0 ), 639 | 70 => array( 0 ), 640 | 71 => array( 0 ), 641 | 80 => array( 5, 6, 7, 8 ), 642 | 81 => array( 5, 6, 7, 8 ), 643 | 86 => array( 5, 6, 7, 8 ), 644 | 87 => array( 5, 6, 7, 8 ), 645 | 88 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 646 | 89 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 647 | 90 => array( 0, 1, 2, 3, 4 ), 648 | 91 => array( 0, 1, 2, 3, 4 ), 649 | 92 => array( 0, 1, 2, 3, 4 ), 650 | 93 => array( 0, 1, 2, 3, 4 ), 651 | 94 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 652 | 95 => array( 0, 1, 2, 3, 4, 5, 6, 7 ) 653 | ), 654 | 655 | 8 => array( 656 | 10 => array( 5, 6, 7 ), 657 | 14 => array( 5, 6, 7 ), 658 | 34 => array( 0, 1, 2, 3, 4, 5 ), 659 | 35 => array( 0, 1, 2, 3, 4, 5 ), 660 | 36 => array( 0, 1, 2, 3, 4, 5 ), 661 | 37 => array( 0, 1, 2, 3, 4, 5 ), 662 | 40 => array( 0, 1 ), 663 | 41 => array( 0, 1 ), 664 | 46 => array( 0, 1 ), 665 | 47 => array( 0, 1 ), 666 | 80 => array( 0, 1, 2 ), 667 | 81 => array( 0, 1, 2 ), 668 | 82 => array( 3 ), 669 | 83 => array( 3 ), 670 | 84 => array( 3 ), 671 | 85 => array( 3 ), 672 | 86 => array( 0, 1, 2 ), 673 | 87 => array( 0, 1, 2 ), 674 | 88 => array( 1, 2 ), 675 | 89 => array( 1, 2 ), 676 | 90 => array( 3 ), 677 | 91 => array( 3 ), 678 | 92 => array( 3 ), 679 | 93 => array( 3 ), 680 | 94 => array( 1, 2 ), 681 | 95 => array( 1, 2 ), 682 | 96 => array( 3, 4, 5 ), 683 | 97 => array( 3, 4, 5 ), 684 | 98 => array( 3, 4, 5 ), 685 | 99 => array( 3, 4, 5 ), 686 | 100 => array( 3, 4, 5 ), 687 | 101 => array( 3, 4, 5 ), 688 | 102 => array( 3, 4, 5 ) 689 | ), 690 | 691 | 4010 => array( 692 | 80 => array( 3, 5, 6, 7, 8 ), 693 | 81 => array( 3, 5, 6, 7, 8 ), 694 | 86 => array( 5, 6, 7, 8 ), 695 | 87 => array( 5, 6, 7 ), 696 | 88 => array( 4, 5, 6 ), 697 | 89 => array( 4, 5 ), 698 | 94 => array( 4, 5, 6 ), 699 | 95 => array( 4, 5, 6 ), 700 | 98 => array( 2, 3, 4, 5 ), 701 | 99 => array( 2, 3, 4, 5 ), 702 | 100 => array( 2, 3, 4, 5 ), 703 | 101 => array( 2, 3, 4, 5 ) 704 | ), 705 | 706 | 4009 => array( 707 | 10 => array( 0, 4, 5, 6, 7 ), 708 | 11 => array( 0, 4, 5, 6, 7 ), 709 | 34 => array( 0, 1, 2, 3, 4, 5 ), 710 | 35 => array( 0, 1, 2, 3, 4, 5 ), 711 | 36 => array( 0, 1, 2, 3, 4, 5 ), 712 | 37 => array( 0, 1, 2, 3, 4, 5 ), 713 | 40 => array( 2 ), 714 | 41 => array( 2 ), 715 | 46 => array( 2 ), 716 | 47 => array( 2 ), 717 | 80 => array( 0, 1, 2 ), 718 | 81 => array( 0, 1, 2 ), 719 | 86 => array( 0, 1, 2 ), 720 | 87 => array( 0, 1, 2 ), 721 | 88 => array( 0, 1, 2 ), 722 | 89 => array( 0, 1, 2 ), 723 | 94 => array( 0, 1, 2 ), 724 | 95 => array( 0, 1, 2 ) 725 | ), 726 | 727 | 11 => array( 728 | 10 => array( 4, 5, 6, 7 ), 729 | 14 => array( 4, 5, 6, 7 ), 730 | 86 => array( 1 ), 731 | 87 => array( 1 ), 732 | 96 => array( 4 ), 733 | 97 => array( 4 ), 734 | 102 => array( 4 ), 735 | 103 => array( 4 ) 736 | ), 737 | 738 | 4011 => array( 739 | 10 => array( 5, 6, 7 ), 740 | 14 => array( 5, 6, 7 ), 741 | 80 => array( 4, 5, 6, 7, 8 ), 742 | 81 => array( 4, 5, 6, 7, 8 ), 743 | 86 => array( 4, 5, 6, 7, 8 ), 744 | 87 => array( 4, 5, 6, 7, 8 ), 745 | 88 => array( 3, 4, 5, 6, 7 ), 746 | 89 => array( 3, 4, 5, 6, 7 ), 747 | 94 => array( 3, 4, 5, 6, 7 ), 748 | 95 => array( 3, 4, 5, 6, 7 ), 749 | 96 => array( 5 ), 750 | 97 => array( 5 ), 751 | 102 => array( 5 ), 752 | 103 => array( 5 ) 753 | ), 754 | 755 | 4211 => array( 756 | 2 => array( 0, 1, 2 ), 757 | 6 => array( 0, 1, 2 ), 758 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 759 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ) 760 | ) 761 | 762 | ); 763 | -------------------------------------------------------------------------------- /db/small_F.robe.php: -------------------------------------------------------------------------------- 1 | array( 12 | 2 => array( 0, 1, 2 ), 13 | 6 => array( 0, 1, 2 ), 14 | 10 => array( 0, 4, 5, 6, 7 ), 15 | 14 => array( 0, 4, 5, 6, 7 ), 16 | 18 => array( 0, 1, 2 ), 17 | 22 => array( 0, 1, 2 ) 18 | ), 19 | 20 | 18 => array( 21 | 10 => array( 5, 6, 7 ), 22 | 14 => array( 5, 6, 7 ), 23 | 80 => array( 7, 8 ), 24 | 81 => array( 7, 8 ), 25 | 86 => array( 7, 8 ), 26 | 87 => array( 7, 8 ) 27 | ), 28 | 29 | 16 => array( 30 | 2 => array( 0, 1, 2 ), 31 | 6 => array( 0, 1, 2 ), 32 | 10 => array( 5, 6, 7 ), 33 | 14 => array( 5, 6, 7 ), 34 | 42 => array( 2 ), 35 | 43 => array( 2 ), 36 | 44 => array( 2 ), 37 | 45 => array( 2 ), 38 | 82 => array( 2, 3 ), 39 | 83 => array( 2, 3 ), 40 | 84 => array( 2, 3 ), 41 | 85 => array( 2, 3 ), 42 | 88 => array( 1, 2 ), 43 | 89 => array( 1, 2 ), 44 | 94 => array( 1, 2 ), 45 | 95 => array( 1, 2 ), 46 | 96 => array( 1, 2, 3, 4, 5 ), 47 | 97 => array( 1, 2, 3, 4, 5 ), 48 | 102 => array( 1, 2, 3, 4, 5 ), 49 | 103 => array( 1, 2, 3, 4, 5 ) 50 | ), 51 | 52 | 3 => array( 53 | 2 => array( 0, 1, 2 ), 54 | 6 => array( 0, 1, 2 ), 55 | 10 => array( 0, 4, 5, 6, 7 ), 56 | 14 => array( 0, 4, 5, 6, 7 ) 57 | ), 58 | 59 | 11 => array( 60 | 82 => array( 4, 5, 6, 7, 8 ), 61 | 83 => array( 4, 5, 6, 7, 8 ), 62 | 84 => array( 4, 5, 6, 7, 8 ), 63 | 85 => array( 4, 5, 6, 7, 8 ), 64 | 90 => array( 3, 4, 5, 6, 7 ), 65 | 91 => array( 3, 4, 5, 6, 7 ), 66 | 92 => array( 3, 4, 5, 6, 7 ), 67 | 93 => array( 3, 4, 5, 6, 7 ) 68 | ), 69 | 70 | 5 => array( 71 | 10 => array( 2, 3, 4, 5, 6, 7 ), 72 | 14 => array( 2, 3, 4, 5, 6, 7 ), 73 | 18 => array( 0, 1, 2 ), 74 | 22 => array( 0, 1, 2 ), 75 | 34 => array( 0, 1, 2, 3, 4, 5 ), 76 | 35 => array( 0, 1, 2, 3, 4, 5 ), 77 | 36 => array( 0, 1, 2, 3, 4, 5 ), 78 | 37 => array( 0, 1, 2, 3, 4, 5 ), 79 | 82 => array( 0, 1, 2, 3 ), 80 | 83 => array( 0, 1, 2, 3 ), 81 | 84 => array( 0, 1, 2, 3 ), 82 | 85 => array( 0, 1, 2, 3 ), 83 | 90 => array( 0, 1, 2, 3 ), 84 | 91 => array( 0, 1, 2, 3 ), 85 | 92 => array( 0, 1, 2, 3 ), 86 | 93 => array( 0, 1, 2, 3 ) 87 | ), 88 | 89 | 4049 => array( 90 | 10 => array( 0, 4, 5, 6, 7 ), 91 | 14 => array( 0, 4, 5, 6, 7 ), 92 | 18 => array( 0, 1, 2 ), 93 | 22 => array( 0, 1, 2 ), 94 | 80 => array( 0, 1, 2 ), 95 | 81 => array( 0, 1, 2 ), 96 | 86 => array( 0, 1, 2 ), 97 | 87 => array( 0, 1, 2 ) 98 | ), 99 | 100 | 6 => array( 101 | 2 => array( 0, 1, 2 ), 102 | 6 => array( 0, 1, 2 ), 103 | 10 => array( 0, 1, 4, 5, 6, 7 ), 104 | 14 => array( 0, 1, 4, 5, 6, 7 ), 105 | 18 => array( 0, 1, 2 ), 106 | 22 => array( 0, 1, 2 ), 107 | 34 => array( 0, 1, 2, 3, 4, 5 ), 108 | 35 => array( 0, 1, 2, 3, 4, 5 ), 109 | 36 => array( 0, 1, 2, 3, 4, 5 ), 110 | 37 => array( 0, 1, 2, 3, 4, 5 ), 111 | 42 => array( 0, 1, 2 ), 112 | 43 => array( 0, 1, 2 ), 113 | 44 => array( 0, 1, 2 ), 114 | 45 => array( 0, 1, 2 ), 115 | 50 => array( 0, 1, 2 ), 116 | 51 => array( 0, 1, 2 ), 117 | 52 => array( 0, 1, 2 ), 118 | 53 => array( 0, 1, 2 ), 119 | 58 => array( 0 ), 120 | 59 => array( 0 ), 121 | 60 => array( 0 ), 122 | 61 => array( 0 ), 123 | 82 => array( 0, 1, 2, 3 ), 124 | 83 => array( 0, 1, 2, 3 ), 125 | 84 => array( 0, 1, 2, 3 ), 126 | 85 => array( 0, 1, 2, 3 ), 127 | 98 => array( 0, 1, 2, 3, 4, 5 ), 128 | 99 => array( 0, 1, 2, 3, 4, 5 ), 129 | 100 => array( 0, 1, 2, 3, 4, 5 ), 130 | 101 => array( 0, 1, 2, 3, 4, 5 ) 131 | ), 132 | 133 | 17 => array( 134 | 2 => array( 0, 1, 2 ), 135 | 6 => array( 0, 1, 2 ), 136 | 10 => array( 4, 5, 6, 7 ), 137 | 14 => array( 4, 5, 6, 7 ), 138 | 18 => array( 0, 1, 2 ), 139 | 22 => array( 0, 1, 2 ), 140 | 34 => array( 0, 1, 2, 3, 4, 5 ), 141 | 35 => array( 0, 1, 2, 3, 4, 5 ), 142 | 36 => array( 0, 1, 2, 3, 4, 5 ), 143 | 37 => array( 0, 1, 2, 3, 4, 5 ), 144 | 42 => array( 0, 1, 2 ), 145 | 43 => array( 0, 1, 2 ), 146 | 44 => array( 0, 1, 2 ), 147 | 45 => array( 0, 1, 2 ), 148 | 50 => array( 0, 1, 2 ), 149 | 51 => array( 0, 1, 2 ), 150 | 52 => array( 0, 1, 2 ), 151 | 53 => array( 0, 1, 2 ), 152 | 58 => array( 0 ), 153 | 59 => array( 0 ), 154 | 60 => array( 0 ), 155 | 61 => array( 0 ), 156 | 82 => array( 0, 1, 2, 3 ), 157 | 83 => array( 0, 1, 2, 3 ), 158 | 84 => array( 0, 1, 2, 3 ), 159 | 85 => array( 0, 1, 2, 3 ), 160 | 90 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 161 | 91 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 162 | 92 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 163 | 93 => array( 0, 1, 2, 3, 4, 5, 6, 7 ) 164 | ), 165 | 166 | 1 => array( 167 | 2 => array( 0, 1, 2 ), 168 | 6 => array( 0, 1, 2 ), 169 | 10 => array( 5, 6, 7 ), 170 | 14 => array( 5, 6, 7 ), 171 | 18 => array( 0, 1, 2 ), 172 | 22 => array( 0, 1, 2 ) 173 | ), 174 | 175 | 7 => array( 176 | 2 => array( 0, 1, 2 ), 177 | 6 => array( 0, 1, 2 ), 178 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 179 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 180 | 18 => array( 0, 1, 2 ), 181 | 22 => array( 0, 1, 2 ), 182 | 88 => array( 0, 5, 6, 7 ), 183 | 89 => array( 0, 5, 6, 7 ), 184 | 94 => array( 0, 5, 6, 7 ), 185 | 95 => array( 0, 5, 6, 7 ) 186 | ), 187 | 188 | 2 => array( 189 | 10 => array( 5, 6, 7 ), 190 | 14 => array( 5, 6, 7 ) 191 | ), 192 | 193 | 15 => array( 194 | 10 => array( 5, 6, 7 ), 195 | 14 => array( 5, 6, 7 ), 196 | 40 => array( 3, 4 ), 197 | 41 => array( 3, 4 ), 198 | 42 => array( 2 ), 199 | 43 => array( 2 ), 200 | 44 => array( 2 ), 201 | 45 => array( 2 ), 202 | 46 => array( 3, 4 ), 203 | 47 => array( 3, 4 ) 204 | ), 205 | 206 | 24 => array( 207 | 10 => array( 1, 2, 3 ), 208 | 14 => array( 1, 2, 3 ) 209 | ), 210 | 211 | 4047 => array( 212 | 2 => array( 0, 1, 2 ), 213 | 6 => array( 0, 1, 2 ), 214 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 215 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 216 | 18 => array( 0, 1, 2 ), 217 | 22 => array( 0, 1, 2 ), 218 | 88 => array( 4, 6 ), 219 | 89 => array( 4, 6 ), 220 | 90 => array( 4 ), 221 | 91 => array( 4 ), 222 | 92 => array( 4 ), 223 | 93 => array( 4 ), 224 | 94 => array( 4, 6 ), 225 | 95 => array( 4, 6 ) 226 | ), 227 | 228 | 4066 => array( 229 | 10 => array( 5, 6, 7 ), 230 | 14 => array( 5, 6, 7 ), 231 | 18 => array( 0, 1, 2 ), 232 | 22 => array( 0, 1, 2 ), 233 | 82 => array( 5 ), 234 | 83 => array( 5 ), 235 | 84 => array( 5 ), 236 | 85 => array( 5 ) 237 | ), 238 | 239 | 4048 => array( 240 | 2 => array( 0, 1, 2 ), 241 | 6 => array( 0, 1, 2 ), 242 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 243 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 244 | 18 => array( 0, 1, 2 ), 245 | 22 => array( 0, 1, 2 ), 246 | 88 => array( 4, 6 ), 247 | 89 => array( 4, 6 ), 248 | 90 => array( 4 ), 249 | 91 => array( 4 ), 250 | 92 => array( 4 ), 251 | 93 => array( 4 ), 252 | 94 => array( 4, 6 ), 253 | 95 => array( 4, 6 ) 254 | ), 255 | 256 | 4082 => array( 257 | 2 => array( 0, 1, 2 ), 258 | 6 => array( 0, 1, 2 ), 259 | 10 => array( 4, 5, 6, 7 ), 260 | 14 => array( 4, 5, 6, 7 ), 261 | 18 => array( 0, 1, 2 ), 262 | 22 => array( 0, 1, 2 ) 263 | ), 264 | 265 | 4059 => array( 266 | 2 => array( 0, 1, 2 ), 267 | 6 => array( 0, 1, 2 ), 268 | 10 => array( 0, 1, 4, 5, 6, 7 ), 269 | 14 => array( 0, 1, 4, 5, 6, 7 ), 270 | 18 => array( 0, 1, 2 ), 271 | 22 => array( 0, 1, 2 ) 272 | ), 273 | 274 | 25 => array( 275 | 10 => array( 5, 6, 7 ), 276 | 14 => array( 5, 6, 7 ) 277 | ), 278 | 279 | 20 => array( 280 | 10 => array( 4 ), 281 | 14 => array( 4 ), 282 | 40 => array( 3, 4 ), 283 | 41 => array( 3, 4 ), 284 | 46 => array( 3, 4 ), 285 | 47 => array( 3, 4 ), 286 | 80 => array( 5, 6, 7, 8 ), 287 | 81 => array( 5, 6, 7, 8 ), 288 | 86 => array( 5, 6, 7, 8 ), 289 | 87 => array( 5, 6, 7, 8 ), 290 | 90 => array( 4, 5, 6, 7 ), 291 | 91 => array( 4, 5, 6, 7 ), 292 | 92 => array( 4, 5, 6, 7 ), 293 | 93 => array( 4, 5, 6, 7 ) 294 | ), 295 | 296 | 4056 => array( 297 | 2 => array( 0, 1, 2 ), 298 | 6 => array( 0, 1, 2 ), 299 | 10 => array( 0, 1, 2, 3, 4 ), 300 | 14 => array( 0, 1, 2, 3, 4 ), 301 | 18 => array( 0, 1, 2 ), 302 | 22 => array( 0, 1, 2 ) 303 | ), 304 | 305 | 4008 => array( 306 | 10 => array( 0, 4, 5, 6, 7 ), 307 | 14 => array( 0, 4, 5, 6, 7 ), 308 | 18 => array( 0, 1, 2 ), 309 | 22 => array( 0, 1, 2 ), 310 | 86 => array( 1, 2 ), 311 | 87 => array( 1, 2 ), 312 | 88 => array( 0, 1, 2 ), 313 | 89 => array( 0, 1, 2 ), 314 | 94 => array( 0, 1, 2 ), 315 | 95 => array( 0, 1, 2 ) 316 | ), 317 | 318 | 4054 => array( 319 | 2 => array( 0, 1, 2 ), 320 | 6 => array( 0, 1, 2 ), 321 | 10 => array( 0, 1, 2, 3, 4 ), 322 | 14 => array( 0, 1, 2, 3, 4 ) 323 | ), 324 | 325 | 4058 => array( 326 | 2 => array( 0, 1, 2 ), 327 | 6 => array( 0, 1, 2 ), 328 | 10 => array( 0, 1, 3, 4, 5, 6, 7 ), 329 | 14 => array( 0, 1, 3, 4, 5, 6, 7 ) 330 | ), 331 | 332 | 4 => array( 333 | 10 => array( 5, 6, 7 ), 334 | 14 => array( 5, 6, 7 ), 335 | 34 => array( 0, 1, 2, 3, 4, 5 ), 336 | 35 => array( 0, 1, 2, 3, 4, 5 ), 337 | 36 => array( 0, 1, 2, 3, 4, 5 ), 338 | 37 => array( 0, 1, 2, 3, 4, 5 ), 339 | 42 => array( 0, 1, 2 ), 340 | 43 => array( 0, 1, 2 ), 341 | 44 => array( 0, 1, 2 ), 342 | 45 => array( 0, 1, 2 ) 343 | ), 344 | 345 | 4067 => array( 346 | 2 => array( 0, 1, 2 ), 347 | 6 => array( 0, 1, 2 ), 348 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 349 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 350 | 18 => array( 0, 1, 2 ), 351 | 22 => array( 0, 1, 2 ), 352 | 42 => array( 2 ), 353 | 43 => array( 2 ), 354 | 44 => array( 2 ), 355 | 45 => array( 2 ), 356 | 82 => array( 2, 3 ), 357 | 83 => array( 2, 3 ), 358 | 84 => array( 2, 3 ), 359 | 85 => array( 2, 3 ) 360 | ), 361 | 362 | 4072 => array( 363 | 2 => array( 0, 1, 2 ), 364 | 6 => array( 0, 1, 2 ), 365 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 366 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 367 | 18 => array( 0, 1, 2 ), 368 | 22 => array( 0, 1, 2 ) 369 | ), 370 | 371 | 4070 => array( 372 | 2 => array( 0, 1, 2 ), 373 | 6 => array( 0, 1, 2 ), 374 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 375 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 376 | 18 => array( 0, 1, 2 ), 377 | 22 => array( 0, 1, 2 ), 378 | 42 => array( 1 ), 379 | 43 => array( 1 ), 380 | 44 => array( 1 ), 381 | 45 => array( 1 ) 382 | ), 383 | 384 | 4012 => array( 385 | 10 => array( 5, 6, 7 ), 386 | 14 => array( 5, 6, 7 ), 387 | 18 => array( 0, 1, 2 ), 388 | 22 => array( 0, 1, 2 ), 389 | 40 => array( 0, 1, 2 ), 390 | 41 => array( 0, 1, 2 ), 391 | 42 => array( 3, 4 ), 392 | 43 => array( 3, 4 ), 393 | 44 => array( 3, 4 ), 394 | 45 => array( 3, 4 ), 395 | 46 => array( 0, 1, 2 ), 396 | 47 => array( 0, 1, 2 ), 397 | 82 => array( 3, 4, 5, 6, 7, 8 ), 398 | 83 => array( 3, 4, 5, 6, 7, 8 ), 399 | 84 => array( 3, 4, 5, 6, 7, 8 ), 400 | 85 => array( 3, 4, 5, 6, 7, 8 ), 401 | 90 => array( 4 ), 402 | 91 => array( 4 ), 403 | 92 => array( 4 ), 404 | 93 => array( 4 ) 405 | ), 406 | 407 | 4018 => array( 408 | 10 => array( 4, 5, 6, 7 ), 409 | 14 => array( 4, 5, 6, 7 ), 410 | 17 => array( 0, 1, 2 ), 411 | 23 => array( 0, 1, 2 ), 412 | 24 => array( 0, 2 ), 413 | 25 => array( 0, 2 ), 414 | 30 => array( 0, 2 ), 415 | 31 => array( 0, 2 ), 416 | 34 => array( 0, 1, 2, 3, 4, 5 ), 417 | 35 => array( 0, 1, 2, 3, 4, 5 ), 418 | 36 => array( 0, 1, 2, 3, 4, 5 ), 419 | 37 => array( 0, 1, 2, 3, 4, 5 ), 420 | 40 => array( 3, 4 ), 421 | 41 => array( 3, 4 ), 422 | 42 => array( 0, 1, 2 ), 423 | 43 => array( 0, 1, 2 ), 424 | 44 => array( 0, 1, 2 ), 425 | 45 => array( 0, 1, 2 ), 426 | 46 => array( 3, 4 ), 427 | 47 => array( 3, 4 ), 428 | 50 => array( 0, 1, 2 ), 429 | 51 => array( 0, 1, 2 ), 430 | 52 => array( 0, 1, 2 ), 431 | 53 => array( 0, 1, 2 ), 432 | 58 => array( 0 ), 433 | 59 => array( 0 ), 434 | 60 => array( 0 ), 435 | 61 => array( 0 ), 436 | 64 => array( 0 ), 437 | 65 => array( 0 ), 438 | 66 => array( 0 ), 439 | 67 => array( 0 ), 440 | 68 => array( 0 ), 441 | 69 => array( 0 ), 442 | 70 => array( 0 ), 443 | 71 => array( 0 ), 444 | 80 => array( 4 ), 445 | 81 => array( 4 ), 446 | 82 => array( 0, 1, 2, 3 ), 447 | 83 => array( 0, 1, 2, 3 ), 448 | 84 => array( 0, 1, 2, 3 ), 449 | 85 => array( 0, 1, 2, 3 ), 450 | 86 => array( 4 ), 451 | 87 => array( 4 ), 452 | 90 => array( 4, 5, 6, 7 ), 453 | 91 => array( 4, 5, 6, 7 ), 454 | 92 => array( 4, 5, 6, 7 ), 455 | 93 => array( 4, 5, 6, 7 ), 456 | 96 => array( 3, 4 ), 457 | 97 => array( 3, 4 ), 458 | 102 => array( 3, 4 ), 459 | 103 => array( 3, 4 ) 460 | ), 461 | 462 | 4057 => array( 463 | 10 => array( 1, 4, 5, 6, 7 ), 464 | 14 => array( 1, 4, 5, 6, 7 ), 465 | 18 => array( 0, 1, 2 ), 466 | 22 => array( 0, 1, 2 ) 467 | ), 468 | 469 | 12 => array( 470 | 2 => array( 0, 1, 2 ), 471 | 6 => array( 0, 1, 2 ), 472 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 473 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 474 | 18 => array( 0, 1, 2 ), 475 | 22 => array( 0, 1, 2 ), 476 | 42 => array( 0, 1 ), 477 | 43 => array( 0, 1 ), 478 | 44 => array( 0, 1 ), 479 | 45 => array( 0, 1 ), 480 | 82 => array( 0, 1, 2 ), 481 | 83 => array( 0, 1, 2 ), 482 | 84 => array( 0, 1, 2 ), 483 | 85 => array( 0, 1, 2 ), 484 | 88 => array( 3, 4 ), 485 | 89 => array( 3, 4 ), 486 | 94 => array( 3, 4 ), 487 | 95 => array( 3, 4 ) 488 | ), 489 | 490 | 4013 => array( 491 | 18 => array( 0, 1, 2 ), 492 | 22 => array( 0, 1, 2 ), 493 | 42 => array( 0 ), 494 | 43 => array( 0 ), 495 | 44 => array( 0 ), 496 | 45 => array( 0 ), 497 | 82 => array( 0, 1, 2, 3 ), 498 | 83 => array( 0, 1, 2, 3 ), 499 | 84 => array( 0, 1, 2, 3 ), 500 | 85 => array( 0, 2, 3 ) 501 | ), 502 | 503 | 4055 => array( 504 | 2 => array( 0, 1, 2 ), 505 | 6 => array( 0, 1, 2 ), 506 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 507 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 508 | 18 => array( 0, 1, 2 ), 509 | 22 => array( 0, 1, 2 ), 510 | 46 => array( 1, 2 ), 511 | 47 => array( 1, 2 ), 512 | 80 => array( 0, 1, 2 ), 513 | 81 => array( 0, 1, 2 ), 514 | 86 => array( 0, 1, 2 ), 515 | 87 => array( 0, 1, 2 ) 516 | ), 517 | 518 | 4069 => array( 519 | 2 => array( 0, 1, 2 ), 520 | 6 => array( 0, 1, 2 ), 521 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 522 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 523 | 18 => array( 0, 1, 2 ), 524 | 22 => array( 0, 1, 2 ), 525 | 34 => array( 0, 1, 2, 3, 4, 5 ), 526 | 35 => array( 0, 1, 2, 3, 4, 5 ), 527 | 36 => array( 0, 1, 2, 3, 4, 5 ), 528 | 37 => array( 0, 1, 2, 3, 4, 5 ), 529 | 82 => array( 0, 1, 2, 3 ), 530 | 83 => array( 0, 1, 2, 3 ), 531 | 84 => array( 0, 1, 2, 3 ), 532 | 85 => array( 0, 1, 2, 3 ), 533 | 90 => array( 0, 1, 2, 3 ), 534 | 91 => array( 0, 1, 2, 3 ), 535 | 92 => array( 0, 1, 2, 3 ), 536 | 93 => array( 0, 1, 2, 3 ), 537 | 98 => array( 1, 2, 3 ), 538 | 99 => array( 1, 2, 3 ), 539 | 100 => array( 1, 2, 3 ), 540 | 101 => array( 1, 2, 3 ) 541 | ), 542 | 543 | 9 => array( 544 | 2 => array( 0, 1, 2 ), 545 | 6 => array( 0, 1, 2 ), 546 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 547 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 548 | 18 => array( 0, 1, 2 ), 549 | 22 => array( 0, 1, 2 ), 550 | 40 => array( 2, 3 ), 551 | 41 => array( 2, 3 ), 552 | 46 => array( 2, 3 ), 553 | 47 => array( 2, 3 ), 554 | 80 => array( 3 ), 555 | 81 => array( 3 ), 556 | 86 => array( 3 ), 557 | 87 => array( 3 ) 558 | ), 559 | 560 | 4071 => array( 561 | 2 => array( 0, 1, 2 ), 562 | 6 => array( 0, 1, 2 ), 563 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 564 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 565 | 18 => array( 0, 1, 2 ), 566 | 22 => array( 0, 1, 2 ) 567 | ), 568 | 569 | 10 => array( 570 | ), 571 | 572 | 4021 => array( 573 | 10 => array( 1, 2, 3, 4, 5, 6 ), 574 | 14 => array( 1, 2, 3, 4, 5, 6 ), 575 | 18 => array( 0, 1, 2 ), 576 | 22 => array( 0, 1, 2 ), 577 | 40 => array( 3, 4 ), 578 | 41 => array( 3, 4 ), 579 | 46 => array( 3, 4 ), 580 | 47 => array( 3, 4 ), 581 | 48 => array( 0, 1, 2 ), 582 | 49 => array( 0, 1, 2 ), 583 | 54 => array( 0, 1, 2 ), 584 | 55 => array( 0, 1, 2 ), 585 | 56 => array( 0 ), 586 | 57 => array( 0 ), 587 | 62 => array( 0 ), 588 | 63 => array( 0 ), 589 | 80 => array( 5, 6, 7, 8 ), 590 | 81 => array( 5, 6, 7, 8 ), 591 | 86 => array( 5, 6, 7, 8 ), 592 | 87 => array( 5, 6, 7, 8 ) 593 | ), 594 | 595 | 4016 => array( 596 | 10 => array( 4, 5, 6, 7 ), 597 | 14 => array( 4, 5, 6, 7 ), 598 | 42 => array( 2 ), 599 | 43 => array( 2 ), 600 | 44 => array( 2 ), 601 | 45 => array( 2 ) 602 | ), 603 | 604 | 14 => array( 605 | 90 => array( 0, 1, 2, 3, 4, 5 ), 606 | 91 => array( 0, 1, 2, 3, 4, 5 ), 607 | 92 => array( 0, 1, 2, 3, 4, 5 ), 608 | 93 => array( 0, 1, 2, 3, 4, 5 ) 609 | ), 610 | 611 | 4019 => array( 612 | 10 => array( 5, 6, 7 ), 613 | 14 => array( 5, 6, 7 ), 614 | 34 => array( 0, 1, 2, 3, 4, 5 ), 615 | 35 => array( 0, 1, 2, 3, 4, 5 ), 616 | 36 => array( 0, 1, 2, 3, 4, 5 ), 617 | 37 => array( 0, 1, 2, 3, 4, 5 ), 618 | 48 => array( 0, 1, 2 ), 619 | 49 => array( 0, 1, 2 ), 620 | 54 => array( 0, 1, 2 ), 621 | 55 => array( 0, 1, 2 ), 622 | 56 => array( 0 ), 623 | 57 => array( 0 ), 624 | 62 => array( 0 ), 625 | 63 => array( 0 ), 626 | 64 => array( 0 ), 627 | 65 => array( 0 ), 628 | 66 => array( 0 ), 629 | 67 => array( 0 ), 630 | 68 => array( 0 ), 631 | 69 => array( 0 ), 632 | 70 => array( 0 ), 633 | 71 => array( 0 ), 634 | 80 => array( 7, 8 ), 635 | 81 => array( 7, 8 ), 636 | 82 => array( 0, 1, 2, 3, 4, 5, 6 ), 637 | 83 => array( 0, 1, 2, 3, 4, 5, 6 ), 638 | 84 => array( 0, 1, 2, 3, 4, 5, 6 ), 639 | 85 => array( 0, 1, 2, 3, 4, 5, 6 ), 640 | 86 => array( 7, 8 ), 641 | 87 => array( 7, 8 ) 642 | ), 643 | 644 | 4046 => array( 645 | 2 => array( 0, 1, 2 ), 646 | 6 => array( 0, 1, 2 ), 647 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 648 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 649 | 18 => array( 0, 1, 2 ), 650 | 22 => array( 0, 1, 2 ), 651 | 88 => array( 4, 6 ), 652 | 89 => array( 4, 6 ), 653 | 90 => array( 4 ), 654 | 91 => array( 4 ), 655 | 92 => array( 4 ), 656 | 93 => array( 4 ), 657 | 94 => array( 4, 6 ), 658 | 95 => array( 4, 6 ) 659 | ), 660 | 661 | 13 => array( 662 | ), 663 | 664 | 4017 => array( 665 | 2 => array( 0, 1, 2 ), 666 | 6 => array( 0, 1, 2 ), 667 | 10 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 668 | 14 => array( 0, 1, 2, 3, 4, 5, 6, 7 ), 669 | 18 => array( 0, 1, 2 ), 670 | 22 => array( 0, 1, 2 ), 671 | 32 => array( 0, 1, 2, 3, 4, 5 ), 672 | 33 => array( 0, 1, 2, 3, 4, 5 ), 673 | 34 => array( 0, 1, 2, 3, 4, 5 ), 674 | 35 => array( 0, 1, 2, 3, 4, 5 ), 675 | 36 => array( 0, 1, 2, 3, 4, 5 ), 676 | 37 => array( 0, 1, 2, 3, 4, 5 ), 677 | 38 => array( 0, 1, 2, 3, 4, 5 ), 678 | 39 => array( 0, 1, 2, 3, 4, 5 ), 679 | 40 => array( 0, 1, 2, 3, 4 ), 680 | 41 => array( 0, 1, 2, 3, 4 ), 681 | 42 => array( 2 ), 682 | 43 => array( 2 ), 683 | 44 => array( 2 ), 684 | 45 => array( 2 ), 685 | 46 => array( 2 ), 686 | 47 => array( 2 ), 687 | 48 => array( 0, 1, 2 ), 688 | 49 => array( 0, 1, 2 ), 689 | 54 => array( 0, 1, 2 ), 690 | 55 => array( 0, 1, 2 ), 691 | 56 => array( 0 ), 692 | 57 => array( 0 ), 693 | 62 => array( 0 ), 694 | 63 => array( 0 ), 695 | 64 => array( 0 ), 696 | 65 => array( 0 ), 697 | 66 => array( 0 ), 698 | 67 => array( 0 ), 699 | 68 => array( 0 ), 700 | 69 => array( 0 ), 701 | 70 => array( 0 ), 702 | 71 => array( 0 ), 703 | 72 => array( 0 ), 704 | 73 => array( 0 ), 705 | 74 => array( 0 ), 706 | 75 => array( 0 ), 707 | 76 => array( 0 ), 708 | 77 => array( 0 ), 709 | 78 => array( 0 ), 710 | 79 => array( 0 ), 711 | 80 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 712 | 81 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 713 | 86 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 714 | 87 => array( 0, 1, 2, 3, 4, 5, 6, 7, 8 ), 715 | 88 => array( 0, 3, 4, 5, 6, 7 ), 716 | 89 => array( 0, 3, 4, 5, 6, 7 ), 717 | 94 => array( 0, 3, 4, 5, 6, 7 ), 718 | 95 => array( 0, 3, 4, 5, 6, 7 ), 719 | 96 => array( 0, 1, 2 ), 720 | 97 => array( 0, 1, 2 ), 721 | 102 => array( 0, 1, 2 ), 722 | 103 => array( 0, 1, 2 ) 723 | ), 724 | 725 | 8 => array( 726 | 2 => array( 0, 1, 2 ), 727 | 6 => array( 0, 1, 2 ), 728 | 10 => array( 2 ), 729 | 14 => array( 2 ), 730 | 18 => array( 0, 1, 2 ), 731 | 22 => array( 0, 1, 2 ), 732 | 42 => array( 0 ), 733 | 43 => array( 0 ), 734 | 44 => array( 0 ), 735 | 45 => array( 0 ), 736 | 80 => array( 4, 5, 6, 7, 8 ), 737 | 81 => array( 4, 5, 6, 7, 8 ), 738 | 82 => array( 0, 1, 2, 3 ), 739 | 83 => array( 0, 1, 2, 3 ), 740 | 84 => array( 0, 1, 2, 3 ), 741 | 85 => array( 0, 1, 2, 3 ), 742 | 86 => array( 4, 5, 6, 7, 8 ), 743 | 87 => array( 4, 5, 6, 7, 8 ), 744 | 88 => array( 4, 5, 6, 7 ), 745 | 89 => array( 4, 5, 6, 7 ), 746 | 90 => array( 0, 1, 2, 3 ), 747 | 91 => array( 0, 1, 2, 3 ), 748 | 92 => array( 0, 1, 2, 3 ), 749 | 93 => array( 0, 1, 2, 3 ), 750 | 94 => array( 4, 5, 6, 7 ), 751 | 95 => array( 4, 5, 6, 7 ) 752 | ), 753 | 754 | 4010 => array( 755 | ), 756 | 757 | 4009 => array( 758 | 10 => array( 0, 4, 5, 6, 7 ), 759 | 14 => array( 0, 4, 5, 6, 7 ), 760 | 42 => array( 1 ), 761 | 43 => array( 1 ), 762 | 44 => array( 1 ), 763 | 45 => array( 1 ), 764 | 80 => array( 4, 5, 6, 7, 8 ), 765 | 81 => array( 4, 5, 6, 7, 8 ), 766 | 82 => array( 0 ), 767 | 83 => array( 0 ), 768 | 84 => array( 0 ), 769 | 85 => array( 0 ), 770 | 86 => array( 4, 5, 6, 7, 8 ), 771 | 87 => array( 4, 5, 6, 7, 8 ), 772 | 88 => array( 4, 5, 6, 7 ), 773 | 89 => array( 4, 5, 6, 7 ), 774 | 90 => array( 0 ), 775 | 91 => array( 0 ), 776 | 92 => array( 0 ), 777 | 93 => array( 0 ), 778 | 94 => array( 4, 5, 6, 7 ), 779 | 95 => array( 4, 5, 6, 7 ) 780 | ), 781 | 782 | 4011 => array( 783 | 10 => array( 0, 1, 2, 7 ), 784 | 14 => array( 0, 1, 2, 7 ), 785 | 80 => array( 6, 7, 8 ), 786 | 81 => array( 6, 7, 8 ), 787 | 86 => array( 6, 7, 8 ), 788 | 87 => array( 6, 7, 8 ) 789 | ), 790 | 791 | 4212 => array( 792 | 10 => array( 4, 5, 6, 7 ), 793 | 14 => array( 4, 5, 6, 7 ), 794 | 90 => array( 1, 2, 3, 4 ), 795 | 91 => array( 1, 2, 3, 4 ), 796 | 92 => array( 1, 2, 3, 4 ), 797 | 93 => array( 1, 2, 3, 4 ) 798 | ), 799 | 800 | ); 801 | --------------------------------------------------------------------------------