├── 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 '
';
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 |   
87 |
88 | -------
89 | Full character, or just the head
90 | -------
91 |  
92 |
93 | -------
94 | Monsters, without or with accessory
95 | -------
96 |  
97 |
98 | -------
99 | License
100 | ---------
101 | http://creativecommons.org/licenses/by-nc-sa/3.0/
102 |
103 | 
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 |
--------------------------------------------------------------------------------