Added website Docker image, bumped PHP version, added mall authentication, added experimental patcher support, improved migrations, added teasers

This commit is contained in:
Exynox 2024-09-22 21:14:31 +03:00
parent a1d0a5b9cf
commit dea61c5a0c
253 changed files with 23071 additions and 547 deletions

18
.dockerignore Normal file
View File

@ -0,0 +1,18 @@
/node_modules
/public/build
/public/hot
/public/storage
/storage
/vendor
.env
.env.backup
.env.production
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode

2
.gitignore vendored
View File

@ -2,7 +2,7 @@
/node_modules
/public/build
/public/hot
/public/storage
/public/patch-data
/storage/*.key
/vendor
.env

View File

@ -3,8 +3,9 @@
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\VerifiesEmails;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\Events\Verified;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
@ -22,8 +23,6 @@ class VerificationController extends Controller
|
*/
use VerifiesEmails;
/**
* Where to redirect users after verification.
*
@ -46,8 +45,8 @@ public function __construct()
/**
* Show the email verification notice.
*
* @param Request $request
* @return RedirectResponse|View
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
*/
public function show(Request $request): View|RedirectResponse
{
@ -56,14 +55,73 @@ public function show(Request $request): View|RedirectResponse
: view('user/registration/verification-notice');
}
/**
* Mark the authenticated user's email address as verified.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function verify(Request $request)
{
if (! hash_equals((string) $request->route('id'), (string) $request->user()->getKey())) {
throw new AuthorizationException;
}
if (! hash_equals((string) $request->route('hash'), sha1($request->user()->getEmailForVerification()))) {
throw new AuthorizationException;
}
if ($request->user()->hasVerifiedEmail()) {
return $request->wantsJson()
? new JsonResponse([], 204)
: redirect($this->redirectPath());
}
if ($request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
if ($response = $this->verified($request)) {
return $response;
}
return $request->wantsJson()
? new JsonResponse([], 204)
: redirect($this->redirectPath())->with('verified', true);
}
/**
* The user has been verified.
*
* @param Request $request
* @return View
* @param \Illuminate\Http\Request $request
* @return mixed
*/
protected function verified(Request $request): View
protected function verified(Request $request): mixed
{
return view('user/registration/registration-success');
}
/**
* Resend the email verification notification.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
*/
public function resend(Request $request)
{
if ($request->user()->hasVerifiedEmail()) {
return $request->wantsJson()
? new JsonResponse([], 204)
: redirect($this->redirectPath());
}
$request->user()->sendEmailVerificationNotification();
return $request->wantsJson()
? new JsonResponse([], 202)
: back()->with('resent', true);
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Mall;
use App\Http\Controllers\Controller;
use App\Models\Game\Player\Player;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
public function auth(Request $request): RedirectResponse
{
if (!$request->hasValidSignature()) {
abort(401);
}
// Validate the request data
$validated = $request->validate([
'pid' => 'required|exists:player.player,id',
'sid' => 'required|int',
]);
// Fetch the player's account
$player = Player::findOrFail($validated['pid']);
$account = $player->account;
// Authenticate user
Auth::login($account);
$request->session()->regenerate();
// Save user's IP address
$account->ip = $request->ip();
$account->saveOrFail();
return redirect(route('mall'));
}
}

View File

@ -0,0 +1,77 @@
<?php
namespace App\Http\Controllers\Patch;
use App\Http\Controllers\Controller;
use SimpleXMLElement;
class PatchConfigController extends Controller
{
public function config(): \Illuminate\Http\Response
{
$patchMethod = 'TORRENT';
$currentVersion = 'nightly-d19dc772db';
$config = [];
if ($patchMethod == 'TORRENT') {
$torrentConfig = [
'port_range' => '6881~6891',
'bandwidth_range' => '5:10:25:50:75:100:150:200:250:500:1000',
'foreground_speed' => 0,
'background_speed' => 10,
'max_uploads_per_session' => 16,
'max_connections_per_session' => 200,
'max_uploads_per_torrent' => 4,
'max_connections_per_torrent' => 50,
'seeding_duration' => 21600,
'web_seed_enable' => 1
];
$config = array_merge($config, $torrentConfig);
}
$noticeConfig = [
'notice_ver' => 1,
'notice_url' => route('patch.notice'),
'notice_width' => 680,
'notice_height' => 500,
];
$config = array_merge($config, $noticeConfig);
$patcherConfig = [
'cur_patcher_path' => 'TorrentPatch.exe',
'new_patcher_path' => 'TorrentPatch.bin',
'new_patcher_crc32' => '0x414EEA07',
];
$config = array_merge($config, $patcherConfig);
$clientConfig = [
'run_path' => 'metin2client.bin',
];
$config = array_merge($config, $clientConfig);
// Build the XML file
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><torrent_config/>');
foreach ($config as $item => $value)
$xml->addAttribute($item, $value);
if ($patchMethod == 'CRC') {
$patchItem = $xml->addChild('foreground_patch');
$patchItem->addAttribute('crcpatch_url', asset('patch-data/crc'));
$patchItem->addAttribute('crcversion', $currentVersion);
}
elseif ($patchMethod == 'TORRENT') {
$patchItem = $xml->addChild('foreground_patch');
$patchItem->addAttribute('torrent_url', asset("patch-data/torrent/{$currentVersion}.torrent"));
if (!empty($torrentConfig['web_seed_enable']) && $torrentConfig['web_seed_enable'] == 1)
$patchItem->addAttribute('webseed_url', asset("patch-data/torrent/"));
}
$xmlData = $xml->asXML();
return response($xmlData, 200, [
'Content-Type' => 'application/xml',
'Content-Length' => strlen($xmlData),
]);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Patch;
use App\Http\Controllers\Controller;
use Illuminate\View\View;
class PatchLandingController extends Controller
{
public function home(): View
{
return view('patch/home');
}
public function notice(): View
{
return view('patch/notice');
}
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Common;
use Illuminate\Database\Eloquent\Model;
class Locale extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'common';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'locale';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'mKey';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'mKey', 'mValue'
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class Banword extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'banword';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'word';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'word'
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class ItemAttr extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'item_attr';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'apply';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class ItemAttrRare extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'item_attr_rare';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'apply';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -1,13 +1,18 @@
<?php
namespace App\Models\Game;
namespace App\Models\Game\Player;
use App\Models\Mall\MallItem;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class ItemProto extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class Land extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'land';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class ObjectProto extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'object_proto';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'vnum';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,73 @@
<?php
namespace App\Models\Game\Player;
use App\Models\Account;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Player extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'player';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
/**
* Get the account that owns the player.
*/
public function account(): BelongsTo
{
return $this->belongsTo(Account::class, 'account_id', 'id');
}
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class RefineProto extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'refine_proto';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class Shop extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'shop';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'vnum';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class ShopItem extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'shop_item';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = '';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Models\Game\Player;
use Illuminate\Database\Eloquent\Model;
class SkillProto extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'player';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'skill_proto';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'dwVnum';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
];
}

View File

@ -7,6 +7,13 @@
class MallCategory extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*

View File

@ -3,13 +3,20 @@
namespace App\Models\Mall;
use App\Models\Enums\MallItemPricingEnum;
use App\Models\Game\ItemProto;
use App\Models\Game\Player\ItemProto;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Support\Facades\Auth;
class MallItem extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The connection name for the model.
*

View File

@ -2,6 +2,7 @@
namespace App\Providers;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@ -19,6 +20,9 @@ public function register(): void
*/
public function boot(): void
{
//
// WARNING: This is a workaround for the old MySQL version currently used by the project.
// This might have unintended consequences.
// https://stackoverflow.com/questions/42244541/laravel-migration-error-syntax-error-or-access-violation-1071-specified-key-wa
Schema::defaultStringLength(191);
}
}

View File

@ -5,12 +5,13 @@
"keywords": ["laravel", "framework"],
"license": "MIT",
"require": {
"php": "^8.1",
"php": "^8.2",
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.10",
"laravel/sanctum": "^3.2",
"laravel/framework": "^11.0",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.8",
"ext-gd": "*"
"ext-gd": "*",
"ext-simplexml": "*"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
@ -18,7 +19,7 @@
"laravel/pint": "^1.0",
"laravel/sail": "^1.18",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^7.0",
"nunomaduro/collision": "^8.1",
"phpunit/phpunit": "^10.1",
"spatie/laravel-ignition": "^2.0"
},

1184
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -70,7 +70,7 @@
*/
'links' => [
public_path('storage') => storage_path('app/public'),
public_path('patch-data') => storage_path('app/public/patch-data'),
],
];

344
database/data/banword.json Normal file
View File

@ -0,0 +1,344 @@
[
{
"word": "aryan"
},
{
"word": "asshole"
},
{
"word": "bastard"
},
{
"word": "bastards"
},
{
"word": "bitch"
},
{
"word": "bitches"
},
{
"word": "bitching"
},
{
"word": "bitchy"
},
{
"word": "boob"
},
{
"word": "boobie"
},
{
"word": "boobies"
},
{
"word": "boobs"
},
{
"word": "booby"
},
{
"word": "boobys"
},
{
"word": "bullshit"
},
{
"word": "bullshitter"
},
{
"word": "bullshitters"
},
{
"word": "bullshitting"
},
{
"word": "chickenshit"
},
{
"word": "chickenshits"
},
{
"word": "clit"
},
{
"word": "cock"
},
{
"word": "cockhead"
},
{
"word": "cocks"
},
{
"word": "cocksuck"
},
{
"word": "cocksucker"
},
{
"word": "cocksucking"
},
{
"word": "cumming"
},
{
"word": "cunt"
},
{
"word": "cuntree"
},
{
"word": "cuntry"
},
{
"word": "cunts"
},
{
"word": "dipshit"
},
{
"word": "dipshits"
},
{
"word": "dumbfuck"
},
{
"word": "dumbfucks"
},
{
"word": "dumbshit"
},
{
"word": "dumbshits"
},
{
"word": "fag"
},
{
"word": "faggot"
},
{
"word": "faggots"
},
{
"word": "faggy"
},
{
"word": "fags"
},
{
"word": "fuck"
},
{
"word": "fucka"
},
{
"word": "fucke"
},
{
"word": "fucked"
},
{
"word": "fucken"
},
{
"word": "fucker"
},
{
"word": "fuckers"
},
{
"word": "fuckface"
},
{
"word": "fuckhead"
},
{
"word": "fuckheads"
},
{
"word": "fuckhed"
},
{
"word": "fuckin"
},
{
"word": "fucking"
},
{
"word": "fucks"
},
{
"word": "fuckup"
},
{
"word": "fuckups"
},
{
"word": "fukk"
},
{
"word": "fukka"
},
{
"word": "goniff"
},
{
"word": "heb"
},
{
"word": "hebe"
},
{
"word": "hebes"
},
{
"word": "kike"
},
{
"word": "kikes"
},
{
"word": "kunt"
},
{
"word": "kuntree"
},
{
"word": "kuntry"
},
{
"word": "kunts"
},
{
"word": "motherfuck"
},
{
"word": "motherfucken"
},
{
"word": "motherfucker"
},
{
"word": "motherfuckers"
},
{
"word": "motherfuckin"
},
{
"word": "motherfucking"
},
{
"word": "nazi"
},
{
"word": "nigga"
},
{
"word": "niggah"
},
{
"word": "niggahs"
},
{
"word": "niggard"
},
{
"word": "niggardly"
},
{
"word": "niggas"
},
{
"word": "niggaz"
},
{
"word": "nigger"
},
{
"word": "niggers"
},
{
"word": "penis"
},
{
"word": "piss"
},
{
"word": "porn"
},
{
"word": "porno"
},
{
"word": "pornography"
},
{
"word": "pussy"
},
{
"word": "schlimazel"
},
{
"word": "schlimiel"
},
{
"word": "shit"
},
{
"word": "shitface"
},
{
"word": "shitfaced"
},
{
"word": "shithead"
},
{
"word": "shitheads"
},
{
"word": "shithed"
},
{
"word": "shits"
},
{
"word": "shitting"
},
{
"word": "shitty"
},
{
"word": "slut"
},
{
"word": "sluts"
},
{
"word": "slutty"
},
{
"word": "titties"
},
{
"word": "titty"
},
{
"word": "vagina"
},
{
"word": "vaginal"
},
{
"word": "whore"
},
{
"word": "whores"
},
{
"word": "whoring"
}
]

View File

@ -0,0 +1,818 @@
[
{
"apply": "MAX_HP",
"prob": "35",
"lv1": "500",
"lv2": "500",
"lv3": "1000",
"lv4": "1500",
"lv5": "2000",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "MAX_SP",
"prob": "35",
"lv1": "10",
"lv2": "20",
"lv3": "30",
"lv4": "50",
"lv5": "80",
"weapon": "0",
"body": "0",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "CON",
"prob": "11",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "8",
"lv5": "12",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "INT",
"prob": "11",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "8",
"lv5": "12",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "STR",
"prob": "11",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "8",
"lv5": "12",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "DEX",
"prob": "11",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "8",
"lv5": "12",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "ATT_SPEED",
"prob": "8",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "8",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "MOV_SPEED",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "20",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "CAST_SPEED",
"prob": "8",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "20",
"weapon": "5",
"body": "5",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "HP_REGEN",
"prob": "60",
"lv1": "4",
"lv2": "8",
"lv3": "12",
"lv4": "20",
"lv5": "30",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "5",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "SP_REGEN",
"prob": "60",
"lv1": "4",
"lv2": "8",
"lv3": "12",
"lv4": "20",
"lv5": "30",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "5",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "POISON_PCT",
"prob": "8",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "8",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "STUN_PCT",
"prob": "18",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "8",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "SLOW_PCT",
"prob": "35",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "8",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "CRITICAL_PCT",
"prob": "18",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "10",
"weapon": "5",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "PENETRATE_PCT",
"prob": "30",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "10",
"weapon": "5",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "ATTBONUS_HUMAN",
"prob": "15",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "10",
"weapon": "5",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATTBONUS_ANIMAL",
"prob": "35",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "20",
"weapon": "5",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATTBONUS_ORC",
"prob": "35",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "20",
"weapon": "5",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATTBONUS_MILGYO",
"prob": "35",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "20",
"weapon": "5",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATTBONUS_UNDEAD",
"prob": "35",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "20",
"weapon": "5",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATTBONUS_DEVIL",
"prob": "35",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "20",
"weapon": "5",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "STEAL_HP",
"prob": "50",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "10",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "STEAL_SP",
"prob": "50",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "10",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "0",
"neck": "5",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "MANA_BURN_PCT",
"prob": "18",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "5",
"lv5": "10",
"weapon": "0",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "BLOCK",
"prob": "10",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "DODGE",
"prob": "10",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "RESIST_SWORD",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "RESIST_TWOHAND",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "RESIST_DAGGER",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "RESIST_BELL",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "RESIST_FAN",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "RESIST_BOW",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "RESIST_FIRE",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "RESIST_ELEC",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "RESIST_MAGIC",
"prob": "25",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "RESIST_WIND",
"prob": "18",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "10",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "REFLECT_MELEE",
"prob": "18",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "6",
"lv5": "10",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "POISON_REDUCE",
"prob": "18",
"lv1": "1",
"lv2": "2",
"lv3": "3",
"lv4": "4",
"lv5": "5",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "EXP_DOUBLE_BONUS",
"prob": "10",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "8",
"lv5": "20",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "GOLD_DOUBLE_BONUS",
"prob": "10",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "8",
"lv5": "20",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "5",
"neck": "5",
"head": "0",
"shield": "5",
"ear": "0"
},
{
"apply": "ITEM_DROP_BONUS",
"prob": "7",
"lv1": "2",
"lv2": "4",
"lv3": "6",
"lv4": "8",
"lv5": "20",
"weapon": "0",
"body": "0",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "5"
},
{
"apply": "IMMUNE_STUN",
"prob": "3",
"lv1": "1",
"lv2": "1",
"lv3": "1",
"lv4": "1",
"lv5": "1",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "1",
"ear": "0"
},
{
"apply": "IMMUNE_SLOW",
"prob": "3",
"lv1": "1",
"lv2": "1",
"lv3": "1",
"lv4": "1",
"lv5": "1",
"weapon": "0",
"body": "0",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "1",
"ear": "0"
},
{
"apply": "ATT_GRADE_BONUS",
"prob": "9",
"lv1": "5",
"lv2": "10",
"lv3": "15",
"lv4": "30",
"lv5": "50",
"weapon": "0",
"body": "5",
"wrist": "0",
"foots": "0",
"neck": "0",
"head": "0",
"shield": "0",
"ear": "0"
},
{
"apply": "RESIST_ICE",
"prob": "18",
"lv1": "6",
"lv2": "8",
"lv3": "10",
"lv4": "12",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "RESIST_EARTH",
"prob": "18",
"lv1": "6",
"lv2": "8",
"lv3": "10",
"lv4": "12",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
},
{
"apply": "RESIST_DARK",
"prob": "18",
"lv1": "6",
"lv2": "8",
"lv3": "10",
"lv4": "12",
"lv5": "15",
"weapon": "0",
"body": "5",
"wrist": "5",
"foots": "0",
"neck": "0",
"head": "5",
"shield": "0",
"ear": "0"
}
]

View File

@ -0,0 +1,342 @@
[
{
"apply": "MAX_HP",
"prob": "1",
"lv1": "500",
"lv2": "500",
"lv3": "500",
"lv4": "500",
"lv5": "500",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "MAX_SP",
"prob": "1",
"lv1": "50",
"lv2": "50",
"lv3": "50",
"lv4": "50",
"lv5": "50",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "CON",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "INT",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "STR",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "DEX",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "CRITICAL_PCT",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "PENETRATE_PCT",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATT_GRADE_BONUS",
"prob": "1",
"lv1": "50",
"lv2": "50",
"lv3": "50",
"lv4": "50",
"lv5": "50",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATT_BONUS_TO_MONSTER",
"prob": "1",
"lv1": "10",
"lv2": "10",
"lv3": "10",
"lv4": "10",
"lv5": "10",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATT_BONUS_TO_WARRIOR",
"prob": "1",
"lv1": "10",
"lv2": "10",
"lv3": "10",
"lv4": "10",
"lv5": "10",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATT_BONUS_TO_ASSASSIN",
"prob": "1",
"lv1": "10",
"lv2": "10",
"lv3": "10",
"lv4": "10",
"lv5": "10",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATT_BONUS_TO_SURA",
"prob": "1",
"lv1": "10",
"lv2": "10",
"lv3": "10",
"lv4": "10",
"lv5": "10",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATT_BONUS_TO_SHAMAN",
"prob": "1",
"lv1": "10",
"lv2": "10",
"lv3": "10",
"lv4": "10",
"lv5": "10",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "RESIST_WARRIOR",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "RESIST_ASSASSIN",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "RESIST_SURA",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "RESIST_SHAMAN",
"prob": "1",
"lv1": "5",
"lv2": "5",
"lv3": "5",
"lv4": "5",
"lv5": "5",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "ATT_SPEED",
"prob": "1",
"lv1": "2",
"lv2": "2",
"lv3": "2",
"lv4": "2",
"lv5": "2",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
},
{
"apply": "MOV_SPEED",
"prob": "1",
"lv1": "8",
"lv2": "8",
"lv3": "8",
"lv4": "8",
"lv5": "8",
"weapon": "5",
"body": "5",
"wrist": "5",
"foots": "5",
"neck": "5",
"head": "5",
"shield": "5",
"ear": "5"
}
]

1946
database/data/land.json Normal file

File diff suppressed because it is too large Load Diff

54
database/data/locale.json Normal file
View File

@ -0,0 +1,54 @@
[
{
"mKey": "LANGUAGE",
"mValue": "en"
},
{
"mKey": "DB_NAME_COLUMN",
"mValue": "locale_name"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE0",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE1",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE2",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE3",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE4",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE5",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE6",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_POWER_BY_LEVEL_TYPE7",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
},
{
"mKey": "SKILL_DAMAGE_BY_LEVEL_UNDER_90",
"mValue": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
},
{
"mKey": "SKILL_DAMAGE_BY_LEVEL_UNDER_45",
"mValue": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
},
{
"mKey": "SKILL_POWER_BY_LEVEL",
"mValue": "0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125"
}
]

View File

@ -0,0 +1,50 @@
[
{
"id": 1,
"name": "New Items"
},
{
"id": 2,
"name": "Modification&New Start"
},
{
"id": 3,
"name": "Contact & Trade"
},
{
"id": 4,
"name": "Regeneration&Strength"
},
{
"id": 5,
"name": "Fight and Aptitude"
},
{
"id": 6,
"name": "Wedding and Marriage"
},
{
"id": 7,
"name": "Refinement"
},
{
"id": 8,
"name": "Special Items"
},
{
"id": 9,
"name": "Hairstyles"
},
{
"id": 10,
"name": "Hairstyles of Attack"
},
{
"id": 11,
"name": "Economy Packages"
},
{
"id": 12,
"name": "Dragon Mark Items"
}
]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,802 @@
[
{
"vnum": 14013,
"name": "weapons factory",
"price": 20000000,
"materials": "90010,20/90011,30/90012,20",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -213,
"reg_2": -213,
"reg_3": 213,
"reg_4": 213,
"npc": 20044,
"group_vnum": 2,
"dependent_group": 1
},
{
"vnum": 14014,
"name": "Armour blacksmith",
"price": 20000000,
"materials": "90010,20/90011,30/90012,20",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -213,
"reg_2": -213,
"reg_3": 213,
"reg_4": 213,
"npc": 20045,
"group_vnum": 2,
"dependent_group": 1
},
{
"vnum": 14015,
"name": "accessory factory",
"price": 20000000,
"materials": "90010,20/90011,30/90012,20",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -213,
"reg_2": -213,
"reg_3": 213,
"reg_4": 213,
"npc": 20046,
"group_vnum": 2,
"dependent_group": 1
},
{
"vnum": 14043,
"name": "diamond smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20060,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14045,
"name": "fossil wood smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20062,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14046,
"name": "copper smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20063,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14047,
"name": "silver smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20064,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14048,
"name": "gold smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20065,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14049,
"name": "jade smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20066,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14050,
"name": "ebony stone smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20067,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14051,
"name": "pearl smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20068,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14052,
"name": "platinum smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20069,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14053,
"name": "crystal smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20070,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14054,
"name": "amethyst smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20071,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14055,
"name": "Heavens tear smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 20072,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 14061,
"name": "Altar of Power",
"price": 25000000,
"materials": "90010,25/90011,25/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -112,
"reg_2": -298,
"reg_3": 114,
"reg_4": 225,
"npc": 20077,
"group_vnum": 4,
"dependent_group": 1
},
{
"vnum": 14062,
"name": "Altar of Power",
"price": 500000000,
"materials": "90010,50/90011,50/90012,50",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -112,
"reg_2": -298,
"reg_3": 114,
"reg_4": 225,
"npc": 20078,
"group_vnum": 4,
"dependent_group": 4
},
{
"vnum": 14063,
"name": "Altar of Power",
"price": 750000000,
"materials": "90010,75/90011,75/90012,75",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -112,
"reg_2": -298,
"reg_3": 114,
"reg_4": 225,
"npc": 20079,
"group_vnum": 4,
"dependent_group": 4
},
{
"vnum": 14100,
"name": "house(1)",
"price": 20000000,
"materials": "90010,20/90011,30/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -279,
"reg_2": -347,
"reg_3": 294,
"reg_4": 325,
"npc": 0,
"group_vnum": 1,
"dependent_group": 0
},
{
"vnum": 14110,
"name": "house(2)",
"price": 20000000,
"materials": "90010,20/90011,30/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -279,
"reg_2": -347,
"reg_3": 294,
"reg_4": 325,
"npc": 0,
"group_vnum": 1,
"dependent_group": 0
},
{
"vnum": 14120,
"name": "house(3)",
"price": 20000000,
"materials": "90010,20/90011,30/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -279,
"reg_2": -347,
"reg_3": 294,
"reg_4": 325,
"npc": 0,
"group_vnum": 1,
"dependent_group": 0
},
{
"vnum": 14141,
"name": "Wooden Wall 1",
"price": 800000,
"materials": "90010,5/90011,15/90012,15",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -2,
"reg_2": -40,
"reg_3": 174,
"reg_4": 40,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14142,
"name": "Wooden Wall 2",
"price": 500000,
"materials": "90010,5/90011,15/90012,15",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -36,
"reg_2": -36,
"reg_3": 36,
"reg_4": 36,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14143,
"name": "Wooden Wall 3",
"price": 800000,
"materials": "90010,5/90011,15/90012,15",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -195,
"reg_2": -52,
"reg_3": 2,
"reg_4": 52,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14144,
"name": "Wooden Gate",
"price": 500000,
"materials": "90010,5/90011,20/90012,20",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -1,
"reg_2": -96,
"reg_3": 348,
"reg_4": 96,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14200,
"name": "guild insignia",
"price": 3000000,
"materials": "90011,5/90012,5",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -23,
"reg_2": -5,
"reg_3": 21,
"reg_4": 20,
"npc": 0,
"group_vnum": 0,
"dependent_group": 1
},
{
"vnum": 14300,
"name": "stone1",
"price": 300000,
"materials": "90010,5",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -58,
"reg_2": -59,
"reg_3": 58,
"reg_4": 59,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14301,
"name": "stone2",
"price": 300000,
"materials": "90010,5",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -59,
"reg_2": -66,
"reg_3": 59,
"reg_4": 66,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14302,
"name": "stone3",
"price": 300000,
"materials": "90010,7",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -67,
"reg_2": -51,
"reg_3": 67,
"reg_4": 51,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14303,
"name": "stone4",
"price": 300000,
"materials": "90010,7",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -52,
"reg_2": -59,
"reg_3": 52,
"reg_4": 59,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14304,
"name": "stone5",
"price": 300000,
"materials": "90010,7",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -86,
"reg_2": -73,
"reg_3": 86,
"reg_4": 73,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14305,
"name": "stone6",
"price": 300000,
"materials": "90010,8",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -96,
"reg_2": -101,
"reg_3": 96,
"reg_4": 101,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14306,
"name": "stone7",
"price": 300000,
"materials": "90010,8",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -92,
"reg_2": -92,
"reg_3": 92,
"reg_4": 92,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14307,
"name": "stone8",
"price": 300000,
"materials": "90010,8",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -33,
"reg_2": -28,
"reg_3": 33,
"reg_4": 28,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14308,
"name": "stone9",
"price": 300000,
"materials": "90010,9",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -33,
"reg_2": -27,
"reg_3": 33,
"reg_4": 27,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14309,
"name": "stone10",
"price": 300000,
"materials": "90010,9",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -91,
"reg_2": -62,
"reg_3": 91,
"reg_4": 62,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14400,
"name": "wood1",
"price": 2000000,
"materials": "90011,5",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14401,
"name": "wood2",
"price": 2000000,
"materials": "90011,5",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14402,
"name": "wood3",
"price": 2000000,
"materials": "90011,7",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14403,
"name": "wood4",
"price": 2000000,
"materials": "90011,7",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14404,
"name": "wood5",
"price": 2000000,
"materials": "90011,7",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14405,
"name": "wood6",
"price": 2000000,
"materials": "90011,9",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14406,
"name": "wood7",
"price": 2000000,
"materials": "90011,9",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14407,
"name": "wood8",
"price": 2000000,
"materials": "90011,9",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 14408,
"name": "wood9",
"price": 2000000,
"materials": "90011,9",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": 0,
"reg_2": 0,
"reg_3": 0,
"reg_4": 0,
"npc": 0,
"group_vnum": 0,
"dependent_group": 0
},
{
"vnum": 26992,
"name": "Soul Crystal tear smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 33009,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 26993,
"name": "Rubin tear smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 33010,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 26994,
"name": "Garnet tear smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 33011,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 26995,
"name": "Smaragd tear smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 33012,
"group_vnum": 3,
"dependent_group": 1
},
{
"vnum": 26996,
"name": "Sapphire tear smelter",
"price": 20000000,
"materials": "90010,15/90011,20/90012,25",
"upgrade_vnum": 0,
"upgrade_limit_time": 0,
"life": 0,
"reg_1": -90,
"reg_2": -100,
"reg_3": 90,
"reg_4": 100,
"npc": 33013,
"group_vnum": 3,
"dependent_group": 1
}
]

File diff suppressed because it is too large Load Diff

157
database/data/shop.json Normal file
View File

@ -0,0 +1,157 @@
[
{
"vnum": 1,
"name": "Weapon Shop Dealer",
"npc_vnum": 9001
},
{
"vnum": 2,
"name": "Fisherman",
"npc_vnum": 9009
},
{
"vnum": 3,
"name": "General Store Saleswoman",
"npc_vnum": 9003
},
{
"vnum": 4,
"name": "Armour Shop Dealer",
"npc_vnum": 9002
},
{
"vnum": 5,
"name": "Weapon Shop Dealer 2",
"npc_vnum": 9007
},
{
"vnum": 6,
"name": "Armour Shop Dealer 2",
"npc_vnum": 9008
},
{
"vnum": 7,
"name": "gold_bar_shop",
"npc_vnum": 9005
},
{
"vnum": 8,
"name": "firework_shop",
"npc_vnum": 9004
},
{
"vnum": 9,
"name": "Peddler",
"npc_vnum": 20042
},
{
"vnum": 10,
"name": "pick_shop",
"npc_vnum": 20015
},
{
"vnum": 11,
"name": "Stable Boy",
"npc_vnum": 20349
},
{
"vnum": 1001,
"name": "all_sword",
"npc_vnum": 0
},
{
"vnum": 1002,
"name": "all_dualhand_sword",
"npc_vnum": 0
},
{
"vnum": 1003,
"name": "all_bow",
"npc_vnum": 0
},
{
"vnum": 1004,
"name": "all_twohand_sword",
"npc_vnum": 0
},
{
"vnum": 1005,
"name": "all_bell",
"npc_vnum": 0
},
{
"vnum": 1006,
"name": "all_fan",
"npc_vnum": 0
},
{
"vnum": 1007,
"name": "all_warrior_armour",
"npc_vnum": 0
},
{
"vnum": 1008,
"name": "all_assassin_armour",
"npc_vnum": 0
},
{
"vnum": 1009,
"name": "all_sura_armour",
"npc_vnum": 0
},
{
"vnum": 1010,
"name": "all_shaman_armour",
"npc_vnum": 0
},
{
"vnum": 1011,
"name": "all_warrior_helmet",
"npc_vnum": 0
},
{
"vnum": 1012,
"name": "all_assassin_helmet",
"npc_vnum": 0
},
{
"vnum": 1013,
"name": "all_sura_helmet",
"npc_vnum": 0
},
{
"vnum": 1014,
"name": "all_shaman_helmet",
"npc_vnum": 0
},
{
"vnum": 1015,
"name": "all_shield",
"npc_vnum": 0
},
{
"vnum": 1016,
"name": "all_bracelet",
"npc_vnum": 0
},
{
"vnum": 1017,
"name": "all_shoe",
"npc_vnum": 0
},
{
"vnum": 1018,
"name": "all_necklace",
"npc_vnum": 0
},
{
"vnum": 1019,
"name": "all_ring",
"npc_vnum": 0
},
{
"vnum": 13,
"name": "Alchemist",
"npc_vnum": 20001
}
]

1452
database/data/shop_item.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -17,6 +18,10 @@ public function up()
$table->string('mKey')->default('')->primary();
$table->string('mValue')->default('');
});
// Populate the table data
$data = File::json(database_path('data/locale.json'));
\App\Models\Game\Common\Locale::upsert($data, ['mKey']);
}
/**

View File

@ -14,6 +14,11 @@
public function up()
{
Schema::connection('common')->create('spam_db', function (Blueprint $table) {
// TODO: update this to modern standards (InnoDB & utf8mb4)
$table->engine = "MyISAM";
$table->charset = "utf8";
$table->collation = "utf8_general_ci";
$table->set('type', ['GOOD', 'SPAM'])->default('SPAM');
$table->string('word', 256)->primary();
$table->integer('score')->default(10);

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -14,8 +15,12 @@
public function up()
{
Schema::connection('player')->create('banword', function (Blueprint $table) {
$table->binary('word')->default('')->primary();
$table->binary('word', length: 24)->default('')->primary();
});
// Populate the table data
$data = File::json(database_path('data/banword.json'));
\App\Models\Game\Player\Banword::upsert($data, ['word']);
}
/**

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -30,6 +31,10 @@ public function up()
$table->string('shield', 100)->default('');
$table->string('ear', 100)->default('');
});
// Populate the table data
$data = File::json(database_path('data/item_attr_rare.json'));
\App\Models\Game\Player\ItemAttrRare::upsert($data, ['apply']);
}
/**

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -30,6 +31,10 @@ public function up()
$table->string('shield', 100)->default('');
$table->string('ear', 100)->default('');
});
// Populate the table data
$data = File::json(database_path('data/item_attr.json'));
\App\Models\Game\Player\ItemAttr::upsert($data, ['apply']);
}
/**

View File

@ -15,8 +15,8 @@ public function up()
{
Schema::connection('player')->create('item_proto', function (Blueprint $table) {
$table->unsignedInteger('vnum')->default(0)->primary();
$table->binary('name')->default('Noname');
$table->binary('locale_name')->default('Noname');
$table->binary('name', length: 24)->default('Noname');
$table->binary('locale_name', length: 24)->default('Noname');
$table->tinyInteger('type')->default(0);
$table->tinyInteger('subtype')->default(0);
$table->tinyInteger('weight')->nullable()->default(0);

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -25,6 +26,10 @@ public function up()
$table->unsignedInteger('price')->default(0);
$table->enum('enable', ['YES', 'NO'])->default('NO');
});
// Populate the table data
$data = File::json(database_path('data/land.json'));
\App\Models\Game\Player\Land::upsert($data, ['id']);
}
/**

View File

@ -15,8 +15,8 @@ public function up()
{
Schema::connection('player')->create('mob_proto', function (Blueprint $table) {
$table->integer('vnum')->default(0)->primary();
$table->string('name', 24)->default('Noname');
$table->binary('locale_name')->default('Noname ');
$table->binary('name', length: 24)->default('Noname');
$table->binary('locale_name', length: 24)->default('Noname');
$table->tinyInteger('rank')->default(0);
$table->tinyInteger('type')->default(0);
$table->boolean('battle_type')->default(false);

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -29,6 +30,10 @@ public function up()
$table->unsignedInteger('group_vnum')->default(0);
$table->unsignedInteger('dependent_group')->default(0);
});
// Populate the table data
$data = File::json(database_path('data/object_proto.json'));
\App\Models\Game\Player\ObjectProto::upsert($data, ['vnum']);
}
/**

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -30,6 +31,10 @@ public function up()
$table->unsignedInteger('result_vnum')->default(0);
$table->smallInteger('prob')->default(100);
});
// Populate the table data
$data = File::json(database_path('data/refine_proto.json'));
\App\Models\Game\Player\RefineProto::upsert($data, ['id']);
}
/**

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -20,6 +21,10 @@ public function up()
$table->unique(['shop_vnum', 'item_vnum', 'count'], 'vnum_unique');
});
// Populate the table data
$data = File::json(database_path('data/shop_item.json'));
\App\Models\Game\Player\ShopItem::upsert($data, ['shop_vnum', 'item_vnum']);
}
/**

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -18,6 +19,10 @@ public function up()
$table->string('name', 32)->default('Noname');
$table->smallInteger('npc_vnum')->default(0);
});
// Populate the table data
$data = File::json(database_path('data/shop.json'));
\App\Models\Game\Player\Shop::upsert($data, ['vnum']);
}
/**

View File

@ -2,6 +2,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@ -15,7 +16,7 @@ public function up()
{
Schema::connection('player')->create('skill_proto', function (Blueprint $table) {
$table->integer('dwVnum')->default(0)->primary();
$table->string('szName', 32)->default('');
$table->binary('szName', 32)->default('');
$table->tinyInteger('bType')->default(0);
$table->tinyInteger('bLevelStep')->default(0);
$table->tinyInteger('bMaxLevel')->default(0);
@ -46,6 +47,14 @@ public function up()
$table->integer('dwTargetRange')->default(1000);
$table->unsignedInteger('dwSplashRange')->default(0);
});
// Populate the table data
$data = File::json(database_path('data/skill_proto.json'));
foreach ($data as $key => &$value) {
// Decode szName from the base64 encoding
$value['szName'] = base64_decode($value['szName']);
}
\App\Models\Game\Player\SkillProto::upsert($data, ['dwVnum']);
}
/**

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::connection('website')->create('guild_highscore_cache', function (Blueprint $table) {
$table->bigInteger('id', true);
$table->text('name');
$table->text('master');
$table->integer('empire');
$table->bigInteger('level');
$table->bigInteger('ladder_point');
$table->timestamp('date')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::connection('website')->dropIfExists('guild_highscore_cache');
}
};

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::connection('website')->create('highscore_cache', function (Blueprint $table) {
$table->bigInteger('id', true);
$table->text('name');
$table->integer('job');
$table->integer('empire');
$table->bigInteger('level');
$table->bigInteger('exp');
$table->timestamp('date')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::connection('website')->dropIfExists('highscore_cache');
}
};

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::connection('website')->create('mall_categories', function (Blueprint $table) {
$table->integer('id', true);
$table->text('name');
});
// Populate the table data
$data = File::json(database_path('data/mall_categories.json'));
\App\Models\Mall\MallCategory::upsert($data, ['id']);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::connection('website')->dropIfExists('mall_categories');
}
};

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::connection('website')->create('mall_data', function (Blueprint $table) {
$table->unsignedInteger('vnum')->default(0)->primary();
$table->unsignedInteger('socket0')->default(0);
$table->unsignedInteger('socket1')->default(0);
$table->unsignedInteger('socket2')->default(0);
$table->unsignedInteger('socket3')->default(0);
$table->unsignedInteger('socket4')->default(0);
$table->unsignedInteger('socket5')->default(0);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::connection('website')->dropIfExists('mall_data');
}
};

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::connection('website')->create('mall_items', function (Blueprint $table) {
$table->integer('id', true);
$table->integer('vnum');
$table->integer('category_id');
$table->integer('old_price')->nullable();
$table->integer('price');
$table->enum('pricing', ['CASH', 'MILEAGE'])->default('CASH');
$table->integer('quantity');
$table->text('image')->nullable();
$table->text('description')->nullable();
$table->enum('other', ['recommend', 'recommend_desc'])->nullable();
});
// Populate the table data
$data = File::json(database_path('data/mall_items.json'));
\App\Models\Mall\MallItem::upsert($data, ['id']);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::connection('website')->dropIfExists('mall_items');
}
};

View File

@ -0,0 +1,49 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::connection('website')->create('mall_storage', function (Blueprint $table) {
$table->bigInteger('id', true);
$table->unsignedInteger('owner_id')->default(0)->index('owner_id_idx');
$table->unsignedTinyInteger('count')->default(0);
$table->unsignedInteger('vnum')->default(0)->index('item_vnum_index');
$table->unsignedInteger('socket0')->default(0);
$table->unsignedInteger('socket1')->default(0);
$table->unsignedInteger('socket2')->default(0);
$table->unsignedInteger('socket3')->default(0);
$table->unsignedInteger('socket4')->default(0);
$table->unsignedInteger('socket5')->default(0);
$table->tinyInteger('attrtype0')->default(0);
$table->smallInteger('attrvalue0')->default(0);
$table->tinyInteger('attrtype1')->default(0);
$table->smallInteger('attrvalue1')->default(0);
$table->tinyInteger('attrtype2')->default(0);
$table->smallInteger('attrvalue2')->default(0);
$table->tinyInteger('attrtype3')->default(0);
$table->smallInteger('attrvalue3')->default(0);
$table->tinyInteger('attrtype4')->default(0);
$table->smallInteger('attrvalue4')->default(0);
$table->tinyInteger('attrtype5')->default(0);
$table->smallInteger('attrvalue5')->default(0);
$table->tinyInteger('attrtype6')->default(0);
$table->smallInteger('attrvalue6')->default(0);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::connection('website')->dropIfExists('mall_storage');
}
};

21
docker/apache/metin2.conf Normal file
View File

@ -0,0 +1,21 @@
# Hide server signature (i.e. Apache version)
ServerSignature Off
ServerTokens Prod
<VirtualHost *:80>
# Identify the correct IP address from Traefik reverse proxy
RemoteIPHeader X-Real-IP
RemoteIPInternalProxy 10.0.0.0/8
RemoteIPInternalProxy 172.16.0.0/12
RemoteIPInternalProxy 192.168.0.0/16
DocumentRoot /app/public
<Directory "/app/public">
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

View File

@ -0,0 +1,74 @@
# syntax=docker/dockerfile:1
FROM php:8.2-apache
#
# Install system packages & dependencies
#
RUN apt-get update && apt-get install -y wget locales
# Composer
RUN wget -O composer-setup.php https://getcomposer.org/installer \
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
&& rm ./composer-setup.php
#
# PHP extensions
#
# GD
RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd
# zip
RUN apt-get install -y libzip-dev \
&& docker-php-ext-configure zip \
&& docker-php-ext-install -j$(nproc) zip
# intl
RUN apt-get install -y libicu-dev \
&& docker-php-ext-configure intl \
&& docker-php-ext-install -j$(nproc) intl
# exif
RUN apt-get install -y exiftool \
&& docker-php-ext-configure exif \
&& docker-php-ext-install -j$(nproc) exif
# MySQL
RUN docker-php-ext-install -j$(nproc) mysqli pdo pdo_mysql
# Install Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && apt-get install -y nodejs
# Configure Apache2
COPY deploy/apache/metin2.conf /etc/apache2/sites-available/metin2.conf
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf && \
a2enmod rewrite && \
a2enmod remoteip && \
a2dissite 000-default && \
a2ensite metin2
# Copy the configuration files
COPY deploy/php/*.ini /usr/local/etc/php/conf.d/
COPY deploy/php/prod/*.ini /usr/local/etc/php/conf.d/
# Copy the source code
RUN mkdir /app
WORKDIR /app
COPY . .
# Install the dependencies
RUN composer install --no-ansi --no-interaction --no-plugins --no-progress --no-scripts --optimize-autoloader
RUN npm ci && npm run build
# Make the init script executable
RUN chmod +x /app/deploy/init.sh
# Expose the API on port 80
EXPOSE 80
# Run supervisord for handling the container services
ENTRYPOINT ["/bin/sh", "-c"]
CMD ["/app/deploy/init.sh"]

50
docker/init.sh Normal file
View File

@ -0,0 +1,50 @@
#!/bin/bash
set -e
KERNEL_VERSION=$(uname -r)
KERNEL_ARCH=$(uname -m)
APACHE_VERSION=$(apache2 -v | head -n 1 | cut -d " " -f 3 | cut -d "/" -f 2)
PHP_VERSION=$(php -r "echo PHP_VERSION;")
echo "The Old Metin2 Project - Web management system"
echo "Kernel ${KERNEL_VERSION}, architecture: ${KERNEL_ARCH}, Apache: ${APACHE_VERSION}, PHP: ${PHP_VERSION}"
# Create storage directories if they don't exist
if [ ! -d /app/storage/app/public/ ]; then
mkdir -p /app/storage/app/public/;
fi
if [ ! -d /app/storage/app/public/patch-data/ ]; then
mkdir -p /app/storage/app/public/patch-data/;
fi
if [ ! -d /app/storage/framework/cache/data/ ]; then
mkdir -p /app/storage/framework/cache/data/;
fi
if [ ! -d /app/storage/framework/sessions/ ]; then
mkdir -p /app/storage/framework/sessions/;
fi
if [ ! -d /app/storage/framework/testing/ ]; then
mkdir -p /app/storage/framework/sessions/;
fi
if [ ! -d /app/storage/framework/views/ ]; then
mkdir -p /app/storage/framework/views/;
fi
if [ ! -d /app/storage/logs/ ]; then
mkdir -p /app/storage/logs/;
fi
# Set folder permissions
chown -R www-data:www-data /app/storage
# Link filesystem paths
/usr/local/bin/php artisan storage:link
# Run database migrations
/usr/local/bin/php artisan migrate --force --no-interaction
# Run Apache webserver
apache2-foreground

View File

@ -0,0 +1,6 @@
; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; https://php.net/expose-php
expose_php = Off

View File

@ -0,0 +1,19 @@
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
; https://php.net/file-uploads
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; https://php.net/upload-tmp-dir
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
; https://php.net/upload-max-filesize
upload_max_filesize = 50M
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

View File

@ -0,0 +1 @@
memory_limit = 300M

View File

@ -0,0 +1,182 @@
; This directive informs PHP of which errors, warnings and notices you would like
; it to take action for. The recommended way of setting values for this
; directive is through the use of the error level constants and bitwise
; operators. The error level constants are below here for convenience as well as
; some common settings and their meanings.
; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
; those related to E_NOTICE and E_STRICT, which together cover best practices and
; recommended coding standards in PHP. For performance reasons, this is the
; recommend error reporting setting. Your production server shouldn't be wasting
; resources complaining about best practices and coding standards. That's what
; development servers and development settings are for.
; Note: The php.ini-development file has this setting as E_ALL. This
; means it pretty much reports everything which is exactly what you want during
; development and early testing.
;
; Error Level Constants:
; E_ALL - All errors and warnings
; E_ERROR - fatal run-time errors
; E_RECOVERABLE_ERROR - almost fatal run-time errors
; E_WARNING - run-time warnings (non-fatal errors)
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
; relying on the fact it is automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
; and forward compatibility of your code
; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
; initial startup
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
; E_DEPRECATED - warn about code that will not work in future versions
; of PHP
; E_USER_DEPRECATED - user-generated deprecation warnings
;
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; https://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; This directive controls whether or not and where PHP will output errors,
; notices and warnings too. Error output is very useful during development, but
; it could be very dangerous in production environments. Depending on the code
; which is triggering the error, sensitive information could potentially leak
; out of your application such as database usernames and passwords or worse.
; For production environments, we recommend logging errors rather than
; sending them to STDOUT.
; Possible Values:
; Off = Do not display any errors
; stderr = Display errors to STDERR (affects only CGI/CLI binaries!)
; On or stdout = Display errors to STDOUT
; Default Value: On
; Development Value: On
; Production Value: Off
; https://php.net/display-errors
display_errors = Off
; The display of errors which occur during PHP's startup sequence are handled
; separately from display_errors. We strongly recommend you set this to 'off'
; for production servers to avoid leaking configuration details.
; Default Value: On
; Development Value: On
; Production Value: Off
; https://php.net/display-startup-errors
display_startup_errors = Off
; Besides displaying errors, PHP can also log errors to locations such as a
; server-specific log, STDERR, or a location specified by the error_log
; directive found below. While errors should not be displayed on productions
; servers they should still be monitored and logging is a great way to do that.
; Default Value: Off
; Development Value: On
; Production Value: On
; https://php.net/log-errors
log_errors = On
; Do not log repeated messages. Repeated errors must occur in same file on same
; line unless ignore_repeated_source is set true.
; https://php.net/ignore-repeated-errors
ignore_repeated_errors = Off
; Ignore source of message when ignoring repeated messages. When this setting
; is On you will not log errors with repeated messages from different files or
; source lines.
; https://php.net/ignore-repeated-source
ignore_repeated_source = Off
; If this parameter is set to Off, then memory leaks will not be shown (on
; stdout or in the log). This is only effective in a debug compile, and if
; error reporting includes E_WARNING in the allowed list
; https://php.net/report-memleaks
report_memleaks = On
; This setting is off by default.
;report_zend_debug = 0
; Turn off normal error reporting and emit XML-RPC error XML
; https://php.net/xmlrpc-errors
;xmlrpc_errors = 0
; An XML-RPC faultCode
;xmlrpc_error_number = 0
; When PHP displays or logs an error, it has the capability of formatting the
; error message as HTML for easier reading. This directive controls whether
; the error message is formatted as HTML or not.
; Note: This directive is hardcoded to Off for the CLI SAPI
; https://php.net/html-errors
;html_errors = On
; If html_errors is set to On *and* docref_root is not empty, then PHP
; produces clickable error messages that direct to a page describing the error
; or function causing the error in detail.
; You can download a copy of the PHP manual from https://php.net/docs
; and change docref_root to the base URL of your local copy including the
; leading '/'. You must also specify the file extension being used including
; the dot. PHP's default behavior is to leave these settings empty, in which
; case no links to documentation are generated.
; Note: Never use this feature for production boxes.
; https://php.net/docref-root
; Examples
;docref_root = "/phpmanual/"
; https://php.net/docref-ext
;docref_ext = .html
; String to output before an error message. PHP's default behavior is to leave
; this setting blank.
; https://php.net/error-prepend-string
; Example:
;error_prepend_string = "<span style='color: #ff0000'>"
; String to output after an error message. PHP's default behavior is to leave
; this setting blank.
; https://php.net/error-append-string
; Example:
;error_append_string = "</span>"
; Log errors to specified file. PHP's default behavior is to leave this value
; empty.
; https://php.net/error-log
; Example:
;error_log = php_errors.log
; Log errors to syslog (Event Log on Windows).
;error_log = syslog
; The syslog ident is a string which is prepended to every message logged
; to syslog. Only used when error_log is set to syslog.
;syslog.ident = php
; The syslog facility is used to specify what type of program is logging
; the message. Only used when error_log is set to syslog.
;syslog.facility = user
; Set this to disable filtering control characters (the default).
; Some loggers only accept NVT-ASCII, others accept anything that's not
; control characters. If your logger accepts everything, then no filtering
; is needed at all.
; Allowed values are:
; ascii (all printable ASCII characters and NL)
; no-ctrl (all characters except control characters)
; all (all characters)
; raw (like "all", but messages are not split at newlines)
; https://php.net/syslog.filter
;syslog.filter = ascii
;windows.show_crt_warning
; Default value: 0
; Development value: 0
; Production value: 0

162
docker/php/prod/opcache.ini Normal file
View File

@ -0,0 +1,162 @@
[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=1
; The OPcache shared memory storage size.
opcache.memory_consumption=512
; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=64
; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 1000000 are allowed.
opcache.max_accelerated_files=50000
; The maximum percentage of "wasted" memory until a restart is scheduled.
opcache.max_wasted_percentage=15
; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
;opcache.use_cwd=1
; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=0
; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
;opcache.revalidate_freq=2
; Enables or disables file search in include_path optimization
;opcache.revalidate_path=0
; If disabled, all PHPDoc comments are dropped from the code to reduce the
; size of the optimized code.
opcache.save_comments=0
; If enabled, compilation warnings (including notices and deprecations) will
; be recorded and replayed each time a file is included. Otherwise, compilation
; warnings will only be emitted when the file is first cached.
;opcache.record_warnings=0
; Allow file existence override (file_exists, etc.) performance feature.
;opcache.enable_file_override=0
; A bitmask, where each bit enables or disables the appropriate OPcache
; passes
;opcache.optimization_level=0x7FFFBFFF
;opcache.dups_fix=0
; The location of the OPcache blacklist file (wildcards allowed).
; Each OPcache blacklist file is a text file that holds the names of files
; that should not be accelerated. The file format is to add each filename
; to a new line. The filename may be a full path or just a file prefix
; (i.e., /var/www/x blacklists all the files and directories in /var/www
; that start with 'x'). Line starting with a ; are ignored (comments).
;opcache.blacklist_filename=
; Allows exclusion of large files from being cached. By default all files
; are cached.
;opcache.max_file_size=0
; Check the cache checksum each N requests.
; The default value of "0" means that the checks are disabled.
;opcache.consistency_checks=0
; How long to wait (in seconds) for a scheduled restart to begin if the cache
; is not being accessed.
;opcache.force_restart_timeout=180
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
; All OPcache errors go to the Web server log.
; By default, only fatal errors (level 0) or errors (level 1) are logged.
; You can also enable warnings (level 2), info messages (level 3) or
; debug messages (level 4).
;opcache.log_verbosity_level=1
; Preferred Shared Memory back-end. Leave empty and let the system decide.
;opcache.preferred_memory_model=
; Protect the shared memory from unexpected writing during script execution.
; Useful for internal debugging only.
;opcache.protect_memory=0
; Allows calling OPcache API functions only from PHP scripts which path is
; started from specified string. The default "" means no restriction
;opcache.restrict_api=
; Mapping base of shared memory segments (for Windows only). All the PHP
; processes have to map shared memory into the same address space. This
; directive allows to manually fix the "Unable to reattach to base address"
; errors.
;opcache.mmap_base=
; Facilitates multiple OPcache instances per user (for Windows only). All PHP
; processes with the same cache ID and user share an OPcache instance.
;opcache.cache_id=
; Enables and sets the second level cache directory.
; It should improve performance when SHM memory is full, at server restart or
; SHM reset. The default "" disables file based caching.
;opcache.file_cache=
; Enables or disables opcode caching in shared memory.
;opcache.file_cache_only=0
; Enables or disables checksum validation when script loaded from file cache.
;opcache.file_cache_consistency_checks=1
; Implies opcache.file_cache_only=1 for a certain process that failed to
; reattach to the shared memory (for Windows only). Explicitly enabled file
; cache is required.
;opcache.file_cache_fallback=1
; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
; This should improve performance, but requires appropriate OS configuration.
;opcache.huge_code_pages=1
; Validate cached file permissions.
;opcache.validate_permission=0
; Prevent name collisions in chroot'ed environment.
;opcache.validate_root=0
; If specified, it produces opcode dumps for debugging different stages of
; optimizations.
;opcache.opt_debug_level=0
; Specifies a PHP script that is going to be compiled and executed at server
; start-up.
; https://php.net/opcache.preload
;opcache.preload=
; Preloading code as root is not allowed for security reasons. This directive
; facilitates to let the preloading to be run as another user.
; https://php.net/opcache.preload_user
;opcache.preload_user=
; Prevents caching files that are less than this number of seconds old. It
; protects from caching of incompletely updated files. In case all file updates
; on your site are atomic, you may increase performance by setting it to "0".
;opcache.file_update_protection=2
; Absolute path used to store shared lockfiles (for *nix only).
;opcache.lockfile_path=/tmp
; JIT control options. Either accepts a string or a 4 digit
; int for advanced controls. See
; https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.jit
opcache.jit=tracing
; The amount of shared memory to reserve for compiled JIT
; code. A zero value disables the JIT.
opcache.jit_buffer_size=100M

View File

@ -0,0 +1,41 @@
@charset "utf-8";
/* CSS Document */
html {
background:#000 url(../img/accept-bg.jpg) no-repeat center 0;
color:#C2C3CF;
font-size:12px;
font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
margin:0 auto;
width:605px;
}
#acceptWrapper {
margin:0 auto;
width:600px;
}
#content {
padding:20px 0 0 165px;
width:395px;
}
h1 {
font-size:19px;
color:#95bcd8;
margin:0 0 15px 0;
}
p {
margin:0 0 20px 0;
line-height:normal;
}
strong {
color:#b9dbac;
font-size:13px;
font-weight:bold;
}
a {
color:#b9dbac;
font-size:12px;
}

View File

@ -0,0 +1,53 @@
@charset "utf-8";
/* CSS Document */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
/* remember to define focus styles! */
:focus {
outline: 0;
}
/* remember to highlight inserts somehow! */
ins {
text-decoration: none;
}
del {
text-decoration: line-through;
}
/* tables still need 'cellspacing="0"' in the markup */
table {
border-collapse: collapse;
border-spacing: 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,113 @@
/**
* --------------------------------------------------------------------
* jQuery-Plugin "pngFix"
* Version: 1.2, 09.03.2009
* by Andreas Eberhard, andreas.eberhard@gmail.com
* http://jquery.andreaseberhard.de/
*
* Copyright (c) 2007 Andreas Eberhard
* Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
*
* Changelog:
* 09.03.2009 Version 1.2
* - Update for jQuery 1.3.x, removed @ from selectors
* 11.09.2007 Version 1.1
* - removed noConflict
* - added png-support for input type=image
* - 01.08.2007 CSS background-image support extension added by Scott Jehl, scott@filamentgroup.com, http://www.filamentgroup.com
* 31.05.2007 initial Version 1.0
* --------------------------------------------------------------------
* @example $(function(){$(document).pngFix();});
* @desc Fixes all PNG's in the document on document.ready
*
* jQuery(function(){jQuery(document).pngFix();});
* @desc Fixes all PNG's in the document on document.ready when using noConflict
*
* @example $(function(){$('div.examples').pngFix();});
* @desc Fixes all PNG's within div with class examples
*
* @example $(function(){$('div.examples').pngFix( { blankgif:'ext.gif' } );});
* @desc Fixes all PNG's within div with class examples, provides blank gif for input with png
* --------------------------------------------------------------------
*/
(function($) {
jQuery.fn.pngFix = function(settings) {
// Settings
settings = jQuery.extend({
blankgif: 'blank.gif'
}, settings);
var ie55 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 5.5") != -1);
var ie6 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 6.0") != -1);
if (jQuery.browser.msie && (ie55 || ie6)) {
//fix images with png-source
jQuery(this).find("img[src$=.png]").each(function() {
jQuery(this).attr('width',jQuery(this).width());
jQuery(this).attr('height',jQuery(this).height());
var prevStyle = '';
var strNewHTML = '';
var imgId = (jQuery(this).attr('id')) ? 'id="' + jQuery(this).attr('id') + '" ' : '';
var imgClass = (jQuery(this).attr('class')) ? 'class="' + jQuery(this).attr('class') + '" ' : '';
var imgTitle = (jQuery(this).attr('title')) ? 'title="' + jQuery(this).attr('title') + '" ' : '';
var imgAlt = (jQuery(this).attr('alt')) ? 'alt="' + jQuery(this).attr('alt') + '" ' : '';
var imgAlign = (jQuery(this).attr('align')) ? 'float:' + jQuery(this).attr('align') + ';' : '';
var imgHand = (jQuery(this).parent().attr('href')) ? 'cursor:hand;' : '';
if (this.style.border) {
prevStyle += 'border:'+this.style.border+';';
this.style.border = '';
}
if (this.style.padding) {
prevStyle += 'padding:'+this.style.padding+';';
this.style.padding = '';
}
if (this.style.margin) {
prevStyle += 'margin:'+this.style.margin+';';
this.style.margin = '';
}
var imgStyle = (this.style.cssText);
strNewHTML += '<span '+imgId+imgClass+imgTitle+imgAlt;
strNewHTML += 'style="position:relative;white-space:pre-line;display:inline-block;background:transparent;'+imgAlign+imgHand;
strNewHTML += 'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;';
strNewHTML += 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + jQuery(this).attr('src') + '\', sizingMethod=\'scale\');';
strNewHTML += imgStyle+'"></span>';
if (prevStyle != ''){
strNewHTML = '<span style="position:relative;display:inline-block;'+prevStyle+imgHand+'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;'+'">' + strNewHTML + '</span>';
}
jQuery(this).hide();
jQuery(this).after(strNewHTML);
});
// fix css background pngs
jQuery(this).find("*").each(function(){
var bgIMG = jQuery(this).css('background-image');
if(bgIMG.indexOf(".png")!=-1){
var iebg = bgIMG.split('url("')[1].split('")')[0];
jQuery(this).css('background-image', 'none');
jQuery(this).get(0).runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + iebg + "',sizingMethod='scale')";
}
});
//fix input with png-source
jQuery(this).find("input[src$=.png]").each(function() {
var bgIMG = jQuery(this).attr('src');
jQuery(this).get(0).runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + bgIMG + '\', sizingMethod=\'scale\');';
jQuery(this).attr('src', settings.blankgif)
});
}
return jQuery;
};
})(jQuery);

View File

@ -0,0 +1,66 @@
html {height: 100%;}
body {background:#000 url('../img/main/body-bg.jpg') no-repeat 50% top;color:#ffffff;font:normal 13px Arial,sans-serif;min-height: 981px;margin:0 auto;height:100%;background-color:#000;}
#page {margin:0 auto;padding:0;position:relative;width:624px;z-index:2;}
/* HEAD */
#headcontent {width:658px;height:622px;display:block;background:url('../img/main/headcontent-bg.jpg') no-repeat;}
#headcontent a.gratisbutton {position:absolute;top:250px;left:40px;width:77px;height:77px;display:block;}
#headcontent .bar { margin-left: 0px }
#story {position:absolute;top:350px;left:45px;width:258px;height:228px;background:url('../img/main/story.png') -5px 0px no-repeat;display:block;text-align:left;}
#story .headline {position:absolute;top:0px;left:0px;width:245px;height:22px;color:#e5b386;font-size:16px;font-weight:bold;padding-left:10px;padding-top:8px;}
#story .maintext {position:absolute;top:42px;left:10px;width:245px;height:185px;color:#ffffff;}
#page #headcontent a.youtube {position:absolute;top:385px;left:302px;width:319px;height:242px;background:url('../img/main/headcontent-youtube.png') 0px -3px no-repeat transparent;display:block;}
/* CONTENT */
#content {margin:0 auto;padding:0;position:relative;top:0px;width:658px;min-height:100px;display:block;background:url('../img/main/content-bg.jpg') repeat-y #000;}
.bar {width:580px;height:38px;margin-left:45px;background:url('../img/main/content-bar.png') -5px 0px no-repeat transparent;display:block;text-align:left;color:#e5b386;font-size:16px;font-weight:bold;padding-left:10px;padding-top:8px;}
.left_col {float:left;margin-left:55px;width:300px;font-family:Arial,sans-serif;}
.right_col {float:left;margin-left:15px;width:240px;font-family:Arial,sans-serif;text-align:center;}
.clear {clear:both;}
.col1 {margin-left:55px;width:540px;font-family:Arial,sans-serif}
.subtitle { color: rgb(233, 196, 155); font-size: 14px; font-weight: bold; margin-top: 15px; margin-bottom: 15px; }
.subtext.last {margin-bottom: 15px;}
img.homethumb {border:1px solid #999;margin-bottom:15px}
a.homethumb, a.homethumb:hover {margin: 45px auto;width:150px}
/* NAVIGATION */
#navigation {margin-left:35px;padding-top:3px;width:586px;height:48px;background:url('../img/main/nav-bar.jpg') no-repeat transparent;}
#navigation a {background:url('../img/main/nav-btn.png') no-repeat transparent;width:160px;height:30px;display:block;text-align:center;padding-top:12px;text-decoration:none;font-size:16px;font-weight:bold;color:#e9d3c0;}
#navigation a:hover, #navigation a:active {background:url('../img/main/nav-btn-hover.png') no-repeat transparent;width:160px;height:30px;display:block;text-align:center;padding-top:12px;text-decoration:none;font-size:16px;font-weight:bold;color:#e9d3c0;}
#navigation a.index_nav {margin-left:10px;float:left;}
#navigation a.news_nav {margin-left:43px;float:left;}
#navigation a.media_nav {margin-left:43px;float:left;}
/* NEWS */
.news_con {padding:10px;border-top:1px dotted #666;}
.news_con a {color:#e5b386}
h3, h3 a {color:#e5b386;font-size:14px;margin-bottom:5px;}
p {margin-bottom:5px;}
.date {color:#b1331b;font-size:12px;margin-right:5px;}
.news_list {margin-left:15px;margin-bottom:15px;list-style-image:url('../img/main/news-list.png');}
a.news_link {color:#e5b386;text-decoration:none}
/* MEDIA */
#media {margin:0 0 0 0;}
#media img {border:1px solid #999;}
#media a {text-decoration:underline;color:#fff;}
#media a:hover {color:#ccc;}
.col4 {float:left;margin-left:20px;margin-bottom:15px;width:127px;text-align:center;}
/* SOCIALS */
a.twitter {margin-left:45px;float:left;width:160px;height:70px;display:block;background:url('../img/main/socials-twitter.png') no-repeat transparent;}
a.rss {float:left;margin-left:45px;margin-top:17px;width:160px;height:53px;display:block;background:url('../img/main/socials-rss.png') no-repeat transparent;}
a.facebook {float:left;margin-left:45px;margin-top:17px;width:160px;height:53px;display:block;background:url('../img/main/socials-facebook.png') no-repeat transparent;}
a.facebook_ymir {float:left;margin-left:45px;margin-top:17px;width:160px;height:53px;display:block;background:url('../img/main/socials-facebook-ymir.png') no-repeat transparent;}
/* FOOTER */
#footer {background:url('../img/main/footer-bg.jpg') no-repeat scroll;color:#596580;display:block;float:left;font:10px Arial;height:202px;width:657px;text-align:center;}
#footer a.playbutton {margin:0 auto;display:block;text-align:center;padding-top:10px;text-decoration:none;font-family:Arial,sans-serif;font-size:16px;font-weight:bold;color:#ffcc99;width:255px;height:40px;background:url('../img/main/playbutton.png') no-repeat transparent;}
#footer a.playbutton:hover {margin:0 auto;display:block;display:block;text-align:center;padding-top:10px;text-decoration:none;font-family:Arial,sans-serif;font-size:16px;font-weight:bold;color:#ffcc99;width:255px;height:40px;background:url('../img/main/playbutton-hover.png') no-repeat transparent;}
#footer a.gameforgelogo {margin:0 auto;display:block;width:152px;height:46px;background:url('../img/main/gameforgelogo.png') no-repeat transparent;}
#footer a.gameforgelogo:hover {margin:0 auto;display:block;width:152px;height:46px;background:url('../img/main/gameforgelogo-hover.png') no-repeat transparent;}
#footer img.usk {float:right;margin-right:10px;margin-top:-45px;}
#footer p { padding:23px 0 0 0; }
#footer p a { color:#e8bf47;text-decoration:none; padding:0 5px 0 5px;}
#footer p a:hover {text-decoration:underline; padding:0 5px 0 5px;}

View File

@ -0,0 +1,528 @@
/* ------------------------------------------------------------------------
This you can edit.
------------------------------------------------------------------------- */
/* ----------------------------------
Default Theme
----------------------------------- */
div.pp_default .pp_top,
div.pp_default .pp_top .pp_middle,
div.pp_default .pp_top .pp_left,
div.pp_default .pp_top .pp_right,
div.pp_default .pp_bottom,
div.pp_default .pp_bottom .pp_left,
div.pp_default .pp_bottom .pp_middle,
div.pp_default .pp_bottom .pp_right { height: 13px; }
div.pp_default .pp_top .pp_left { background: url(../img/prettyPhoto/default/sprite.png) -78px -93px no-repeat; } /* Top left corner */
div.pp_default .pp_top .pp_middle { background: url(../img/prettyPhoto/default/sprite_x.png) top left repeat-x; } /* Top pattern/color */
div.pp_default .pp_top .pp_right { background: url(../img/prettyPhoto/default/sprite.png) -112px -93px no-repeat; } /* Top right corner */
div.pp_default .pp_content .ppt { color: #f8f8f8; }
div.pp_default .pp_content_container .pp_left { background: url(../img/prettyPhoto/default/sprite_y.png) -7px 0 repeat-y; padding-left: 13px; }
div.pp_default .pp_content_container .pp_right { background: url(../img/prettyPhoto/default/sprite_y.png) top right repeat-y; padding-right: 13px; }
div.pp_default .pp_content { background-color: #fff; } /* Content background */
div.pp_default .pp_next:hover { background: url(../img/prettyPhoto/default/sprite_next.png) center right no-repeat; cursor: pointer; } /* Next button */
div.pp_default .pp_previous:hover { background: url(../img/prettyPhoto/default/sprite_prev.png) center left no-repeat; cursor: pointer; } /* Previous button */
div.pp_default .pp_expand { background: url(../img/prettyPhoto/default/sprite.png) 0 -29px no-repeat; cursor: pointer; width: 28px; height: 28px; } /* Expand button */
div.pp_default .pp_expand:hover { background: url(../img/prettyPhoto/default/sprite.png) 0 -56px no-repeat; cursor: pointer; } /* Expand button hover */
div.pp_default .pp_contract { background: url(../img/prettyPhoto/default/sprite.png) 0 -84px no-repeat; cursor: pointer; width: 28px; height: 28px; } /* Contract button */
div.pp_default .pp_contract:hover { background: url(../img/prettyPhoto/default/sprite.png) 0 -113px no-repeat; cursor: pointer; } /* Contract button hover */
div.pp_default .pp_close { width: 30px; height: 30px; background: url(../img/prettyPhoto/default/sprite.png) 2px 1px no-repeat; cursor: pointer; } /* Close button */
div.pp_default #pp_full_res .pp_inline { color: #000; }
div.pp_default .pp_gallery ul li a { background: url(../img/prettyPhoto/default/default_thumb.png) center center #f8f8f8; border:1px solid #aaa; }
div.pp_default .pp_gallery ul li a:hover,
div.pp_default .pp_gallery ul li.selected a { border-color: #fff; }
div.pp_default .pp_gallery a.pp_arrow_previous,
div.pp_default .pp_gallery a.pp_arrow_next { position: static; left: auto; }
div.pp_default .pp_nav .pp_play,
div.pp_default .pp_nav .pp_pause { background: url(../img/prettyPhoto/default/sprite.png) -51px 1px no-repeat; height:30px; width:30px; }
div.pp_default .pp_nav .pp_pause { background-position: -51px -29px; }
div.pp_default .pp_details { position: relative; }
div.pp_default a.pp_arrow_previous,
div.pp_default a.pp_arrow_next { background: url(../img/prettyPhoto/default/sprite.png) -31px -3px no-repeat; height: 20px; margin: 4px 0 0 0; width: 20px; }
div.pp_default a.pp_arrow_next { left: 52px; background-position: -82px -3px; } /* The next arrow in the bottom nav */
div.pp_default .pp_content_container .pp_details { margin-top: 5px; }
div.pp_default .pp_nav { clear: none; height: 30px; width: 105px; position: relative; }
div.pp_default .pp_nav .currentTextHolder{ font-family: Georgia; font-style: italic; font-color:#999; font-size: 11px; left: 75px; line-height: 25px; margin: 0; padding: 0 0 0 10px; position: absolute; top: 2px; }
div.pp_default .pp_close:hover, div.pp_default .pp_nav .pp_play:hover, div.pp_default .pp_nav .pp_pause:hover, div.pp_default .pp_arrow_next:hover, div.pp_default .pp_arrow_previous:hover { opacity:0.7; }
div.pp_default .pp_description{ font-size: 11px; font-weight: bold; line-height: 14px; margin: 5px 50px 5px 0; }
div.pp_default .pp_bottom .pp_left { background: url(../img/prettyPhoto/default/sprite.png) -78px -127px no-repeat; } /* Bottom left corner */
div.pp_default .pp_bottom .pp_middle { background: url(../img/prettyPhoto/default/sprite_x.png) bottom left repeat-x; } /* Bottom pattern/color */
div.pp_default .pp_bottom .pp_right { background: url(../img/prettyPhoto/default/sprite.png) -112px -127px no-repeat; } /* Bottom right corner */
div.pp_default .pp_loaderIcon { background: url(../img/prettyPhoto/default/loader.gif) center center no-repeat; } /* Loader icon */
/* ----------------------------------
Light Rounded Theme
----------------------------------- */
div.light_rounded .pp_top .pp_left { background: url(../img/prettyPhoto/light_rounded/sprite.png) -88px -53px no-repeat; } /* Top left corner */
div.light_rounded .pp_top .pp_middle { background: #fff; } /* Top pattern/color */
div.light_rounded .pp_top .pp_right { background: url(../img/prettyPhoto/light_rounded/sprite.png) -110px -53px no-repeat; } /* Top right corner */
div.light_rounded .pp_content .ppt { color: #000; }
div.light_rounded .pp_content_container .pp_left,
div.light_rounded .pp_content_container .pp_right { background: #fff; }
div.light_rounded .pp_content { background-color: #fff; } /* Content background */
div.light_rounded .pp_next:hover { background: url(../img/prettyPhoto/light_rounded/btnNext.png) center right no-repeat; cursor: pointer; } /* Next button */
div.light_rounded .pp_previous:hover { background: url(../img/prettyPhoto/light_rounded/btnPrevious.png) center left no-repeat; cursor: pointer; } /* Previous button */
div.light_rounded .pp_expand { background: url(../img/prettyPhoto/light_rounded/sprite.png) -31px -26px no-repeat; cursor: pointer; } /* Expand button */
div.light_rounded .pp_expand:hover { background: url(../img/prettyPhoto/light_rounded/sprite.png) -31px -47px no-repeat; cursor: pointer; } /* Expand button hover */
div.light_rounded .pp_contract { background: url(../img/prettyPhoto/light_rounded/sprite.png) 0 -26px no-repeat; cursor: pointer; } /* Contract button */
div.light_rounded .pp_contract:hover { background: url(../img/prettyPhoto/light_rounded/sprite.png) 0 -47px no-repeat; cursor: pointer; } /* Contract button hover */
div.light_rounded .pp_close { width: 75px; height: 22px; background: url(../img/prettyPhoto/light_rounded/sprite.png) -1px -1px no-repeat; cursor: pointer; } /* Close button */
div.light_rounded .pp_details { position: relative; }
div.light_rounded .pp_description { margin-right: 85px; }
div.light_rounded #pp_full_res .pp_inline { color: #000; }
div.light_rounded .pp_gallery a.pp_arrow_previous,
div.light_rounded .pp_gallery a.pp_arrow_next { margin-top: 12px !important; }
div.light_rounded .pp_nav .pp_play { background: url(../img/prettyPhoto/light_rounded/sprite.png) -1px -100px no-repeat; height: 15px; width: 14px; }
div.light_rounded .pp_nav .pp_pause { background: url(../img/prettyPhoto/light_rounded/sprite.png) -24px -100px no-repeat; height: 15px; width: 14px; }
div.light_rounded .pp_arrow_previous { background: url(../img/prettyPhoto/light_rounded/sprite.png) 0 -71px no-repeat; } /* The previous arrow in the bottom nav */
div.light_rounded .pp_arrow_previous.disabled { background-position: 0 -87px; cursor: default; }
div.light_rounded .pp_arrow_next { background: url(../img/prettyPhoto/light_rounded/sprite.png) -22px -71px no-repeat; } /* The next arrow in the bottom nav */
div.light_rounded .pp_arrow_next.disabled { background-position: -22px -87px; cursor: default; }
div.light_rounded .pp_bottom .pp_left { background: url(../img/prettyPhoto/light_rounded/sprite.png) -88px -80px no-repeat; } /* Bottom left corner */
div.light_rounded .pp_bottom .pp_middle { background: #fff; } /* Bottom pattern/color */
div.light_rounded .pp_bottom .pp_right { background: url(../img/prettyPhoto/light_rounded/sprite.png) -110px -80px no-repeat; } /* Bottom right corner */
div.light_rounded .pp_loaderIcon { background: url(../img/prettyPhoto/light_rounded/loader.gif) center center no-repeat; } /* Loader icon */
/* ----------------------------------
Dark Rounded Theme
----------------------------------- */
div.dark_rounded .pp_top .pp_left { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -88px -53px no-repeat; } /* Top left corner */
div.dark_rounded .pp_top .pp_middle { background: url(../img/prettyPhoto/dark_rounded/contentPattern.png) top left repeat; } /* Top pattern/color */
div.dark_rounded .pp_top .pp_right { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -110px -53px no-repeat; } /* Top right corner */
div.dark_rounded .pp_content_container .pp_left { background: url(../img/prettyPhoto/dark_rounded/contentPattern.png) top left repeat-y; } /* Left Content background */
div.dark_rounded .pp_content_container .pp_right { background: url(../img/prettyPhoto/dark_rounded/contentPattern.png) top right repeat-y; } /* Right Content background */
div.dark_rounded .pp_content { background: url(../img/prettyPhoto/dark_rounded/contentPattern.png) top left repeat; } /* Content background */
div.dark_rounded .pp_next:hover { background: url(../img/prettyPhoto/dark_rounded/btnNext.png) center right no-repeat; cursor: pointer; } /* Next button */
div.dark_rounded .pp_previous:hover { background: url(../img/prettyPhoto/dark_rounded/btnPrevious.png) center left no-repeat; cursor: pointer; } /* Previous button */
div.dark_rounded .pp_expand { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -31px -26px no-repeat; cursor: pointer; } /* Expand button */
div.dark_rounded .pp_expand:hover { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -31px -47px no-repeat; cursor: pointer; } /* Expand button hover */
div.dark_rounded .pp_contract { background: url(../img/prettyPhoto/dark_rounded/sprite.png) 0 -26px no-repeat; cursor: pointer; } /* Contract button */
div.dark_rounded .pp_contract:hover { background: url(../img/prettyPhoto/dark_rounded/sprite.png) 0 -47px no-repeat; cursor: pointer; } /* Contract button hover */
div.dark_rounded .pp_close { width: 75px; height: 22px; background: url(../img/prettyPhoto/dark_rounded/sprite.png) -1px -1px no-repeat; cursor: pointer; } /* Close button */
div.dark_rounded .pp_details { position: relative; }
div.dark_rounded .pp_description { margin-right: 85px; }
div.dark_rounded .currentTextHolder { color: #c4c4c4; }
div.dark_rounded .pp_description { color: #fff; }
div.dark_rounded #pp_full_res .pp_inline { color: #fff; }
div.dark_rounded .pp_gallery a.pp_arrow_previous,
div.dark_rounded .pp_gallery a.pp_arrow_next { margin-top: 12px !important; }
div.dark_rounded .pp_nav .pp_play { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -1px -100px no-repeat; height: 15px; width: 14px; }
div.dark_rounded .pp_nav .pp_pause { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -24px -100px no-repeat; height: 15px; width: 14px; }
div.dark_rounded .pp_arrow_previous { background: url(../img/prettyPhoto/dark_rounded/sprite.png) 0 -71px no-repeat; } /* The previous arrow in the bottom nav */
div.dark_rounded .pp_arrow_previous.disabled { background-position: 0 -87px; cursor: default; }
div.dark_rounded .pp_arrow_next { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -22px -71px no-repeat; } /* The next arrow in the bottom nav */
div.dark_rounded .pp_arrow_next.disabled { background-position: -22px -87px; cursor: default; }
div.dark_rounded .pp_bottom .pp_left { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -88px -80px no-repeat; } /* Bottom left corner */
div.dark_rounded .pp_bottom .pp_middle { background: url(../img/prettyPhoto/dark_rounded/contentPattern.png) top left repeat; } /* Bottom pattern/color */
div.dark_rounded .pp_bottom .pp_right { background: url(../img/prettyPhoto/dark_rounded/sprite.png) -110px -80px no-repeat; } /* Bottom right corner */
div.dark_rounded .pp_loaderIcon { background: url(../img/prettyPhoto/dark_rounded/loader.gif) center center no-repeat; } /* Loader icon */
/* ----------------------------------
Dark Square Theme
----------------------------------- */
div.dark_square .pp_left ,
div.dark_square .pp_middle,
div.dark_square .pp_right,
div.dark_square .pp_content { background: #000; }
div.dark_square .currentTextHolder { color: #c4c4c4; }
div.dark_square .pp_description { color: #fff; }
div.dark_square .pp_loaderIcon { background: url(../img/prettyPhoto/dark_square/loader.gif) center center no-repeat; } /* Loader icon */
div.dark_square .pp_expand { background: url(../img/prettyPhoto/dark_square/sprite.png) -31px -26px no-repeat; cursor: pointer; } /* Expand button */
div.dark_square .pp_expand:hover { background: url(../img/prettyPhoto/dark_square/sprite.png) -31px -47px no-repeat; cursor: pointer; } /* Expand button hover */
div.dark_square .pp_contract { background: url(../img/prettyPhoto/dark_square/sprite.png) 0 -26px no-repeat; cursor: pointer; } /* Contract button */
div.dark_square .pp_contract:hover { background: url(../img/prettyPhoto/dark_square/sprite.png) 0 -47px no-repeat; cursor: pointer; } /* Contract button hover */
div.dark_square .pp_close { width: 75px; height: 22px; background: url(../img/prettyPhoto/dark_square/sprite.png) -1px -1px no-repeat; cursor: pointer; } /* Close button */
div.dark_square .pp_details { position: relative; }
div.dark_square .pp_description { margin: 0 85px 0 0; }
div.dark_square #pp_full_res .pp_inline { color: #fff; }
div.dark_square .pp_gallery a.pp_arrow_previous,
div.dark_square .pp_gallery a.pp_arrow_next { margin-top: 12px !important; }
div.dark_square .pp_nav { clear: none; }
div.dark_square .pp_nav .pp_play { background: url(../img/prettyPhoto/dark_square/sprite.png) -1px -100px no-repeat; height: 15px; width: 14px; }
div.dark_square .pp_nav .pp_pause { background: url(../img/prettyPhoto/dark_square/sprite.png) -24px -100px no-repeat; height: 15px; width: 14px; }
div.dark_square .pp_arrow_previous { background: url(../img/prettyPhoto/dark_square/sprite.png) 0 -71px no-repeat; } /* The previous arrow in the bottom nav */
div.dark_square .pp_arrow_previous.disabled { background-position: 0 -87px; cursor: default; }
div.dark_square .pp_arrow_next { background: url(../img/prettyPhoto/dark_square/sprite.png) -22px -71px no-repeat; } /* The next arrow in the bottom nav */
div.dark_square .pp_arrow_next.disabled { background-position: -22px -87px; cursor: default; }
div.dark_square .pp_next:hover { background: url(../img/prettyPhoto/dark_square/btnNext.png) center right no-repeat; cursor: pointer; } /* Next button */
div.dark_square .pp_previous:hover { background: url(../img/prettyPhoto/dark_square/btnPrevious.png) center left no-repeat; cursor: pointer; } /* Previous button */
/* ----------------------------------
Light Square Theme
----------------------------------- */
div.light_square .pp_left ,
div.light_square .pp_middle,
div.light_square .pp_right,
div.light_square .pp_content { background: #fff; }
div.light_square .pp_content .ppt { color: #000; }
div.light_square .pp_expand { background: url(../img/prettyPhoto/light_square/sprite.png) -31px -26px no-repeat; cursor: pointer; } /* Expand button */
div.light_square .pp_expand:hover { background: url(../img/prettyPhoto/light_square/sprite.png) -31px -47px no-repeat; cursor: pointer; } /* Expand button hover */
div.light_square .pp_contract { background: url(../img/prettyPhoto/light_square/sprite.png) 0 -26px no-repeat; cursor: pointer; } /* Contract button */
div.light_square .pp_contract:hover { background: url(../img/prettyPhoto/light_square/sprite.png) 0 -47px no-repeat; cursor: pointer; } /* Contract button hover */
div.light_square .pp_close { width: 75px; height: 22px; background: url(../img/prettyPhoto/light_square/sprite.png) -1px -1px no-repeat; cursor: pointer; } /* Close button */
div.light_square .pp_details { position: relative; }
div.light_square .pp_description { margin-right: 85px; }
div.light_square #pp_full_res .pp_inline { color: #000; }
div.light_square .pp_gallery a.pp_arrow_previous,
div.light_square .pp_gallery a.pp_arrow_next { margin-top: 12px !important; }
div.light_square .pp_nav .pp_play { background: url(../img/prettyPhoto/light_square/sprite.png) -1px -100px no-repeat; height: 15px; width: 14px; }
div.light_square .pp_nav .pp_pause { background: url(../img/prettyPhoto/light_square/sprite.png) -24px -100px no-repeat; height: 15px; width: 14px; }
div.light_square .pp_arrow_previous { background: url(../img/prettyPhoto/light_square/sprite.png) 0 -71px no-repeat; } /* The previous arrow in the bottom nav */
div.light_square .pp_arrow_previous.disabled { background-position: 0 -87px; cursor: default; }
div.light_square .pp_arrow_next { background: url(../img/prettyPhoto/light_square/sprite.png) -22px -71px no-repeat; } /* The next arrow in the bottom nav */
div.light_square .pp_arrow_next.disabled { background-position: -22px -87px; cursor: default; }
div.light_square .pp_next:hover { background: url(../img/prettyPhoto/light_square/btnNext.png) center right no-repeat; cursor: pointer; } /* Next button */
div.light_square .pp_previous:hover { background: url(../img/prettyPhoto/light_square/btnPrevious.png) center left no-repeat; cursor: pointer; } /* Previous button */
div.light_square .pp_loaderIcon { background: url(../img/prettyPhoto/light_rounded/loader.gif) center center no-repeat; } /* Loader icon */
/* ----------------------------------
Facebook style Theme
----------------------------------- */
div.facebook .pp_top .pp_left { background: url(../img/prettyPhoto/facebook/sprite.png) -88px -53px no-repeat; } /* Top left corner */
div.facebook .pp_top .pp_middle { background: url(../img/prettyPhoto/facebook/contentPatternTop.png) top left repeat-x; } /* Top pattern/color */
div.facebook .pp_top .pp_right { background: url(../img/prettyPhoto/facebook/sprite.png) -110px -53px no-repeat; } /* Top right corner */
div.facebook .pp_content .ppt { color: #000; }
div.facebook .pp_content_container .pp_left { background: url(../img/prettyPhoto/facebook/contentPatternLeft.png) top left repeat-y; } /* Content background */
div.facebook .pp_content_container .pp_right { background: url(../img/prettyPhoto/facebook/contentPatternRight.png) top right repeat-y; } /* Content background */
div.facebook .pp_content { background: #fff; } /* Content background */
div.facebook .pp_expand { background: url(../img/prettyPhoto/facebook/sprite.png) -31px -26px no-repeat; cursor: pointer; } /* Expand button */
div.facebook .pp_expand:hover { background: url(../img/prettyPhoto/facebook/sprite.png) -31px -47px no-repeat; cursor: pointer; } /* Expand button hover */
div.facebook .pp_contract { background: url(../img/prettyPhoto/facebook/sprite.png) 0 -26px no-repeat; cursor: pointer; } /* Contract button */
div.facebook .pp_contract:hover { background: url(../img/prettyPhoto/facebook/sprite.png) 0 -47px no-repeat; cursor: pointer; } /* Contract button hover */
div.facebook .pp_close { width: 22px; height: 22px; background: url(../img/prettyPhoto/facebook/sprite.png) -1px -1px no-repeat; cursor: pointer; } /* Close button */
div.facebook .pp_details { position: relative; }
div.facebook .pp_description { margin: 0 37px 0 0; }
div.facebook #pp_full_res .pp_inline { color: #000; }
div.facebook .pp_loaderIcon { background: url(../img/prettyPhoto/facebook/loader.gif) center center no-repeat; } /* Loader icon */
div.facebook .pp_arrow_previous { background: url(../img/prettyPhoto/facebook/sprite.png) 0 -71px no-repeat; height: 22px; margin-top: 0; width: 22px; } /* The previous arrow in the bottom nav */
div.facebook .pp_arrow_previous.disabled { background-position: 0 -96px; cursor: default; }
div.facebook .pp_arrow_next { background: url(../img/prettyPhoto/facebook/sprite.png) -32px -71px no-repeat; height: 22px; margin-top: 0; width: 22px; } /* The next arrow in the bottom nav */
div.facebook .pp_arrow_next.disabled { background-position: -32px -96px; cursor: default; }
div.facebook .pp_nav { margin-top: 0; }
div.facebook .pp_nav p { font-size: 15px; padding: 0 3px 0 4px; }
div.facebook .pp_nav .pp_play { background: url(../img/prettyPhoto/facebook/sprite.png) -1px -123px no-repeat; height: 22px; width: 22px; }
div.facebook .pp_nav .pp_pause { background: url(../img/prettyPhoto/facebook/sprite.png) -32px -123px no-repeat; height: 22px; width: 22px; }
div.facebook .pp_next:hover { background: url(../img/prettyPhoto/facebook/btnNext.png) center right no-repeat; cursor: pointer; } /* Next button */
div.facebook .pp_previous:hover { background: url(../img/prettyPhoto/facebook/btnPrevious.png) center left no-repeat; cursor: pointer; } /* Previous button */
div.facebook .pp_bottom .pp_left { background: url(../img/prettyPhoto/facebook/sprite.png) -88px -80px no-repeat; } /* Bottom left corner */
div.facebook .pp_bottom .pp_middle { background: url(../img/prettyPhoto/facebook/contentPatternBottom.png) top left repeat-x; } /* Bottom pattern/color */
div.facebook .pp_bottom .pp_right { background: url(../img/prettyPhoto/facebook/sprite.png) -110px -80px no-repeat; } /* Bottom right corner */
/* ------------------------------------------------------------------------
DO NOT CHANGE
------------------------------------------------------------------------- */
div.pp_pic_holder a:focus { outline:none; }
div.pp_overlay {
background: #000;
display: none;
left: 0;
position: absolute;
top: 0;
width: 100%;
z-index: 9500;
}
div.pp_pic_holder {
display: none;
position: absolute;
width: 100px;
z-index: 10000;
}
.pp_top {
height: 20px;
position: relative;
}
* html .pp_top { padding: 0 20px; }
.pp_top .pp_left {
height: 20px;
left: 0;
position: absolute;
width: 20px;
}
.pp_top .pp_middle {
height: 20px;
left: 20px;
position: absolute;
right: 20px;
}
* html .pp_top .pp_middle {
left: 0;
position: static;
}
.pp_top .pp_right {
height: 20px;
left: auto;
position: absolute;
right: 0;
top: 0;
width: 20px;
}
.pp_content { height: 40px; min-width: 40px; }
* html .pp_content { width: 40px; }
.pp_fade { display: none; }
.pp_content_container {
position: relative;
text-align: left;
width: 100%;
}
.pp_content_container .pp_left { padding-left: 20px; }
.pp_content_container .pp_right { padding-right: 20px; }
.pp_content_container .pp_details {
float: left;
margin: 10px 0 2px 0;
}
.pp_description {
display: none;
margin: 0;
}
.pp_social { float: left; margin: 7px 0 0 0; }
.pp_social .facebook { float: left; position: relative; top: -1px; margin-left: 5px; width: 55px; overflow: hidden; }
.pp_social .twitter { float: left; }
.pp_nav {
clear: right;
float: left;
margin: 3px 10px 0 0;
}
.pp_nav p {
float: left;
margin: 2px 4px;
}
.pp_nav .pp_play,
.pp_nav .pp_pause {
float: left;
margin-right: 4px;
text-indent: -10000px;
}
a.pp_arrow_previous,
a.pp_arrow_next {
display: block;
float: left;
height: 15px;
margin-top: 3px;
overflow: hidden;
text-indent: -10000px;
width: 14px;
}
.pp_hoverContainer {
position: absolute;
top: 0;
width: 100%;
z-index: 2000;
}
.pp_gallery {
display: none;
left: 50%;
margin-top: -50px;
position: absolute;
z-index: 10000;
}
.pp_gallery div {
float: left;
overflow: hidden;
position: relative;
}
.pp_gallery ul {
float: left;
height: 35px;
margin: 0 0 0 5px;
padding: 0;
position: relative;
white-space: nowrap;
}
.pp_gallery ul a {
border: 1px #000 solid;
border: 1px rgba(0,0,0,0.5) solid;
display: block;
float: left;
height: 33px;
overflow: hidden;
}
.pp_gallery ul a:hover,
.pp_gallery li.selected a { border-color: #fff; }
.pp_gallery ul a img { border: 0; }
.pp_gallery li {
display: block;
float: left;
margin: 0 5px 0 0;
padding: 0;
}
.pp_gallery li.default a {
background: url(../img/prettyPhoto/facebook/default_thumbnail.gif) 0 0 no-repeat;
display: block;
height: 33px;
width: 50px;
}
.pp_gallery li.default a img { display: none; }
.pp_gallery .pp_arrow_previous,
.pp_gallery .pp_arrow_next {
margin-top: 7px !important;
}
a.pp_next {
background: url(../img/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;
display: block;
float: right;
height: 100%;
text-indent: -10000px;
width: 49%;
}
a.pp_previous {
background: url(../img/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;
display: block;
float: left;
height: 100%;
text-indent: -10000px;
width: 49%;
}
a.pp_expand,
a.pp_contract {
cursor: pointer;
display: none;
height: 20px;
position: absolute;
right: 30px;
text-indent: -10000px;
top: 10px;
width: 20px;
z-index: 20000;
}
a.pp_close {
position: absolute; right: 0; top: 0;
display: block;
line-height:22px;
text-indent: -10000px;
}
.pp_bottom {
height: 20px;
position: relative;
}
* html .pp_bottom { padding: 0 20px; }
.pp_bottom .pp_left {
height: 20px;
left: 0;
position: absolute;
width: 20px;
}
.pp_bottom .pp_middle {
height: 20px;
left: 20px;
position: absolute;
right: 20px;
}
* html .pp_bottom .pp_middle {
left: 0;
position: static;
}
.pp_bottom .pp_right {
height: 20px;
left: auto;
position: absolute;
right: 0;
top: 0;
width: 20px;
}
.pp_loaderIcon {
display: block;
height: 24px;
left: 50%;
margin: -12px 0 0 -12px;
position: absolute;
top: 50%;
width: 24px;
}
#pp_full_res {
line-height: 1 !important;
}
#pp_full_res .pp_inline {
text-align: left;
}
#pp_full_res .pp_inline p { margin: 0 0 15px 0; }
div.ppt {
color: #fff;
display: none;
font-size: 17px;
margin: 0 0 5px 15px;
z-index: 9999;
}
/* ------------------------------------------------------------------------
Miscellaneous
------------------------------------------------------------------------- */

View File

@ -0,0 +1,52 @@
/* RESET CSS */
/* v1.0 | 20080212 */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
vertical-align: baseline;
}
body {
line-height: normal;
}
ol, ul {
list-style: none;
padding:0;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after, q:before, q:after {
content: '';
content: none;
}
/* remember to define focus styles! */
:focus {
outline: 0;
}
/* remember to highlight inserts somehow! */
ins {
text-decoration: none;
}
del {
text-decoration: line-through;
}
/* tables still need 'cellspacing="0"' in the markup */
table {
border-collapse: collapse;
border-spacing: 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Some files were not shown because too many files have changed in this diff Show More