add: Pet system.

master
WildEgo 2025-09-27 15:30:42 +01:00
parent ef842f99c6
commit c74891af87
12 changed files with 7699 additions and 6923 deletions

View File

@ -0,0 +1,29 @@
<?php
namespace App\Models\Enums;
enum GrowthPetAffectEnum: string
{
case JIJOONG_WARRIOR = 'JIJOONG_WARRIOR';
case JIJOONG_SURA = 'JIJOONG_SURA';
case JIJOONG_ASSASSIN = 'JIJOONG_ASSASSIN';
case JIJOONG_SHAMAN = 'JIJOONG_SHAMAN';
case PACHEON = 'PACHEON';
case BANYA = 'BANYA';
case CHEONRYEONG = 'CHEONRYEONG';
case CHOEHOENBIMU = 'CHOEHOENBIMU';
case HEAL = 'HEAL';
case STEALHP = 'STEALHP';
case STEALMP = 'STEALMP';
case BLOCK = 'BLOCK';
case REFLECT_MELEE = 'REFLECT_MELEE';
case GOLD_DROP = 'GOLD_DROP';
case BOW_DISTANCE = 'BOW_DISTANCE';
case INVINCIBILITY = 'INVINCIBILITY';
case REMOVAL = 'REMOVAL';
case POTION = 'POTION';
case MOB_BONUS = 'MOB_BONUS';
case EXP = 'EXP';
case HP_RECOVER = 'HP_RECOVER';
case FEATHER = 'FEATHER';
}

View File

@ -0,0 +1,25 @@
<?php
namespace App\Models\Enums;
enum GrowthPetPointEnum: string
{
case RESIST_WARRIOR = 'RESIST_WARRIOR';
case RESIST_SURA = 'RESIST_SURA';
case RESIST_ASSASSIN = 'RESIST_ASSASSIN';
case RESIST_SHAMAN = 'RESIST_SHAMAN';
case RESIST_MAGIC_REDUCTION = 'RESIST_MAGIC_REDUCTION';
case MELEE_MAGIC_ATT_BONUS_PER = 'MELEE_MAGIC_ATT_BONUS_PER';
case ATTBONUS_MONSTER = 'ATTBONUS_MONSTER';
case PENETRATE_PCT = 'PENETRATE_PCT';
case CASTING_SPEED = 'CASTING_SPEED';
case BOW_DISTANCE = 'BOW_DISTANCE';
case STEAL_SP = 'STEAL_SP';
case STEAL_HP = 'STEAL_HP';
case KILL_HP_RECOVERY = 'KILL_HP_RECOVERY';
case BLOCK = 'BLOCK';
case REFLECT_MELEE = 'REFLECT_MELEE';
case GOLD_DOUBLE_BONUS = 'GOLD_DOUBLE_BONUS';
case EXP_DOUBLE_BONUS = 'EXP_DOUBLE_BONUS';
case POTION_BONUS = 'POTION_BONUS';
}

View File

@ -0,0 +1,10 @@
<?php
namespace App\Models\Enums;
enum GrowthPetStateEnum: string
{
case UPBRINGING = 'UPBRINGING';
case BAG = 'BAG';
case SAFEBOX = 'SAFEBOX';
}

View File

@ -0,0 +1,9 @@
<?php
namespace App\Models\Enums;
enum GrowthPetTypeEnum: string
{
case PASSIVE = 'PASSIVE';
case AUTO = 'AUTO';
}

View File

@ -39,7 +39,10 @@ enum ItemTypesEnum: int
case ITEM_TYPE_SECONDARY_COIN = 32;
case ITEM_TYPE_RING = 33;
case ITEM_TYPE_BELT = 34;
case ITEM_TYPE_MAX_NUM = 35;
case ITEM_TYPE_SOUL = 35;
case ITEM_TYPE_GACHA = 36;
case ITEM_TYPE_PET = 37;
case ITEM_TYPE_MAX_NUM = 38;
public function getLabel(): string
{

View File

@ -0,0 +1,56 @@
<?php
namespace App\Models\Game\Player;
use App\Models\Enums\GrowthPetStateEnum;
use Illuminate\Database\Eloquent\Model;
class GrowthPet extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'growth_pet';
/**
* 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 = [
'state' => GrowthPetStateEnum::class,
];
}

View File

@ -0,0 +1,60 @@
<?php
namespace App\Models\Game\Player;
use App\Models\Enums\GrowthPetAffectEnum;
use App\Models\Enums\GrowthPetPointEnum;
use App\Models\Enums\GrowthPetTypeEnum;
use Illuminate\Database\Eloquent\Model;
class GrowthPetSkillProto extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'growth_pet_skill_proto';
/**
* 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 = [
'bType' => GrowthPetTypeEnum::class,
'setAffectFlag' => GrowthPetAffectEnum::class,
'szPointOn' => GrowthPetPointEnum::class,
];
}

View File

@ -0,0 +1,435 @@
{
"55701": [
{
"dwSkillVnum": 1,
"szName": "Resistance (Warrior)",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "JIJOONG_WARRIOR",
"szPointOn": "RESIST_WARRIOR",
"pointPoly": [
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.455 + lv*0.1625)",
"1 + (k*0.455 + lv*0.1625)",
"1 + (k*0.455 + lv*0.1625)",
"1 + (k*0.455 + lv*0.1625)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 2,
"szName": "Resistance (Sura)",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "JIJOONG_SURA",
"szPointOn": "RESIST_SURA",
"pointPoly": [
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.42 + lv*0.15)",
"1 + (k*0.455 + lv*0.1625)",
"1 + (k*0.455 + lv*0.1625)",
"1 + (k*0.455 + lv*0.1625)",
"1 + (k*0.455 + lv*0.1625)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 3,
"szName": "Resistance (Ninja)",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "JIJOONG_ASSASSIN",
"szPointOn": "RESIST_ASSASSIN",
"pointPoly": [
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 4,
"szName": "Resistance (Shaman)",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "JIJOONG_SHAMAN",
"szPointOn": "RESIST_SHAMAN",
"pointPoly": [
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 6,
"szName": "Berserker",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "PACHEON",
"szPointOn": "MELEE_MAGIC_ATT_BONUS_PER",
"pointPoly": [
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 7,
"szName": "Anti-Magic",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "BANYA",
"szPointOn": "RESIST_MAGIC_REDUCTION",
"pointPoly": [
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 8,
"szName": "Haste",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "CHEONRYEONG",
"szPointOn": "CASTING_SPEED",
"pointPoly": [
"1 + (k*0.595 + lv*0.2125)",
"1 + (k*0.595 + lv*0.2125)",
"1 + (k*0.595 + lv*0.2125)",
"1 + (k*0.595 + lv*0.2125)",
"1 + (k*0.595 + lv*0.2125)",
"1 + (k*0.595 + lv*0.2125)",
"1 + (k*0.595 + lv*0.2125)",
"1 + (k*0.595 + lv*0.2125)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 9,
"szName": "Drill",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "CHOEHOENBIMU",
"szPointOn": "PENETRATE_PCT",
"pointPoly": [
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 10,
"szName": "Restoration",
"bType": "AUTO",
"dwCooldown": 480,
"setAffectFlag": "HEAL",
"szPointOn": null,
"pointPoly": [
"706.6 + (k*222.579 + lv*79.4925)",
"706.6 + (k*222.579 + lv*79.4925)",
"706.6 + (k*222.579 + lv*79.4925)",
"706.6 + (k*222.579 + lv*79.4925)",
"706.6 + (k*222.579 + lv*79.4925)",
"706.6 + (k*222.579 + lv*79.4925)",
"706.6 + (k*222.579 + lv*79.4925)",
"706.6 + (k*222.579 + lv*79.4925)"
],
"szActivatePctPoly": "58",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 11,
"szName": "Vampirism",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "STEALHP",
"szPointOn": "STEAL_HP",
"pointPoly": [
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 12,
"szName": "Spiritualism",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "STEALMP",
"szPointOn": "STEAL_SP",
"pointPoly": [
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 13,
"szName": "Bulwark",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "BLOCK",
"szPointOn": "BLOCK",
"pointPoly": [
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)",
"1 + (k*0.385 + lv*0.1375)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 14,
"szName": "Reflection",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "REFLECT_MELEE",
"szPointOn": "REFLECT_MELEE",
"pointPoly": [
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 15,
"szName": "Yang Drop",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "GOLD_DROP",
"szPointOn": "GOLD_DOUBLE_BONUS",
"pointPoly": [
"10.6 + (k*3.339 + lv*1.1925)",
"10.8 + (k*3.402 + lv*1.215)",
"10.8 + (k*3.402 + lv*1.215)",
"11.2 + (k*3.528 + lv*1.26)",
"11.2 + (k*3.528 + lv*1.26)",
"11.6 + (k*3.654 + lv*1.305)",
"11.6 + (k*3.654 + lv*1.305)",
"11.6 + (k*3.654 + lv*1.305)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 16,
"szName": "Range",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "BOW_DISTANCE",
"szPointOn": "BOW_DISTANCE",
"pointPoly": [
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.21 + lv*0.075)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 17,
"szName": "Immortal",
"bType": "AUTO",
"dwCooldown": 600,
"setAffectFlag": "INVINCIBILITY",
"szPointOn": null,
"pointPoly": [
"10 + (k*0.595 + lv*0.2125)",
"10 + (k*0.595 + lv*0.2125)",
"10 + (k*0.595 + lv*0.2125)",
"10 + (k*0.595 + lv*0.2125)",
"10 + (k*0.595 + lv*0.2125)",
"10 + (k*0.595 + lv*0.2125)",
"10 + (k*0.595 + lv*0.2125)",
"10 + (k*0.595 + lv*0.2125)"
],
"szActivatePctPoly": "53",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 18,
"szName": "Panacea",
"bType": "AUTO",
"dwCooldown": 480,
"setAffectFlag": "REMOVAL",
"szPointOn": null,
"pointPoly": ["0", "0", "0", "0", "0", "0", "0", "0"],
"szActivatePctPoly": "41",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 19,
"szName": "Master Brewer",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "POTION",
"szPointOn": "POTION_BONUS",
"pointPoly": [
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)",
"1 + (k*0.315 + lv*0.1125)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 20,
"szName": "Monster Hunter",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "MOB_BONUS",
"szPointOn": "ATTBONUS_MONSTER",
"pointPoly": [
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)",
"1 + (k*0.245 + lv*0.0875)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 21,
"szName": "Eagle Eyes",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "EXP",
"szPointOn": "EXP_DOUBLE_BONUS",
"pointPoly": [
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 22,
"szName": "Life Drain",
"bType": "PASSIVE",
"dwCooldown": 0,
"setAffectFlag": "HP_RECOVER",
"szPointOn": "KILL_HP_RECOVERY",
"pointPoly": [
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)",
"1 + (k*0.175 + lv*0.0625)"
],
"szActivatePctPoly": "0",
"szDurationPoly": "0"
},
{
"dwSkillVnum": 23,
"szName": "Light as a Feather",
"bType": "AUTO",
"dwCooldown": 10,
"setAffectFlag": "FEATHER",
"szPointOn": null,
"pointPoly": [
"150 + (k*5.25 + lv*1.875)",
"150 + (k*5.25 + lv*1.875)",
"150 + (k*5.25 + lv*1.875)",
"150 + (k*5.25 + lv*1.875)",
"150 + (k*5.25 + lv*1.875)",
"150 + (k*5.25 + lv*1.875)",
"150 + (k*5.25 + lv*1.875)",
"150 + (k*5.25 + lv*1.875)"
],
"szActivatePctPoly": "44+ (k*0.455 + lv*0.1625)",
"szDurationPoly": "50 + (k*2.8 + lv*1)"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
<?php
use App\Models\Game\Player\RefineProto;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
@ -15,7 +16,7 @@ return new class extends Migration
public function up()
{
Schema::create('refine_proto', function (Blueprint $table) {
$table->unsignedInteger('id', true)->primary();
$table->unsignedInteger('id', false)->primary();
$table->unsignedInteger('vnum0')->default(0);
$table->smallInteger('count0')->default(0);
$table->unsignedInteger('vnum1')->default(0);
@ -34,7 +35,7 @@ return new class extends Migration
// Populate the table data
$data = File::json(database_path('data/refine_proto.json'));
\App\Models\Game\Player\RefineProto::upsert($data, ['id']);
RefineProto::upsert($data, ['id']);
}
/**

View File

@ -0,0 +1,59 @@
<?php
use App\Models\Enums\GrowthPetStateEnum;
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::create('growth_pet', function (Blueprint $table) {
$table->integer('id')->primary();
$table->integer('owner_id');
$table->integer('vnum');
$table->enum('state', array_column(GrowthPetStateEnum::cases(), 'value'))
->default(GrowthPetStateEnum::UPBRINGING)
->nullable();
$table->string('name', 20)->nullable();
$table->tinyInteger('size');
$table->integer('level')->default(1)->nullable();
$table->tinyInteger('level_step')->default(0)->nullable();
$table->tinyInteger('evolution')->default(1)->nullable();
$table->tinyInteger('type')->nullable();
$table->integer('hp')->default(0)->nullable();
$table->integer('sp')->default(0)->nullable();
$table->integer('def')->default(0)->nullable();
$table->tinyInteger('hp_apply')->default(0)->nullable();
$table->tinyInteger('sp_apply')->default(0)->nullable();
$table->tinyInteger('def_apply')->default(0)->nullable();
$table->tinyInteger('age_apply')->default(0)->nullable();
$table->binary('skill_level')->nullable();
$table->integer('exp')->nullable();
$table->integer('item_exp')->nullable();
$table->dateTime('birthday')->nullable();
$table->integer('end_time')->default(0)->nullable();
$table->integer('max_time')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('growth_pet');
}
};

View File

@ -0,0 +1,72 @@
<?php
use App\Models\Enums\GrowthPetAffectEnum;
use App\Models\Enums\GrowthPetPointEnum;
use App\Models\Enums\GrowthPetTypeEnum;
use App\Models\Game\Player\GrowthPetSkillProto;
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::create('growth_pet_skill_proto', function (Blueprint $table) {
$table->integer('dwPetVnum');
$table->integer('dwSkillVnum');
$table->string('szName', 32);
$table->enum('bType', array_column(GrowthPetTypeEnum::cases(), 'value'));
$table->integer('dwCooldown')->length(3);
$table->enum('setAffectFlag', array_column(GrowthPetAffectEnum::cases(), 'value'))->nullable();
$table->enum('szPointOn', array_column(GrowthPetPointEnum::cases(), 'value'))->nullable();
$table->string('szPointPoly1', 100);
$table->string('szPointPoly2', 100);
$table->string('szPointPoly3', 100);
$table->string('szPointPoly4', 100);
$table->string('szPointPoly5', 100);
$table->string('szPointPoly6', 100);
$table->string('szPointPoly7', 100);
$table->string('szPointPoly8', 100);
$table->string('szActivatePctPoly', 100);
$table->string('szDurationPoly', 100);
$table->primary(['dwPetVnum', 'dwSkillVnum']);
});
// Populate the table data
$data = File::json(database_path('data/growth_pet_skill_proto.json'));
GrowthPetSkillProto::upsert(
collect($data)->flatMap(function ($skills, $petVnum) {
return collect($skills)->map(function ($skill) use ($petVnum) {
$skill['dwPetVnum'] = $petVnum;
$skill = [
...$skill,
...collect(array_pad($skill['pointPoly'], 8, 0))
->mapWithKeys(fn ($val, $key) => ['szPointPoly'.($key + 1) => $val])
->toArray(),
];
unset($skill['pointPoly']);
return $skill;
});
})->toArray(),
['dwPetVnum', 'dwSkillVnum']
);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('growth_pet_skill_proto');
}
};