2026-05-30 20:23:54 +08:00

207 lines
6.4 KiB
PHP

<?php
namespace common\modules\pet\vo;
use common\modules\pet\PetUtil;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
/**
*
CREATE TABLE `pet` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`pet_config_id` varchar(45) NOT NULL COMMENT '宠物配置ID',
`name` varchar(45) NOT NULL,
`level` int(11) NOT NULL,
`exp` int(11) NOT NULL,
`feed` int(11) NOT NULL,
`hp` int(11) NOT NULL COMMENT '当前血量',
`last_feed_update_time` int(11) NOT NULL COMMENT '上次计算喂养点时间',
`blood` int(11) NOT NULL COMMENT '血',
`attack` int(11) NOT NULL COMMENT '攻击',
`anti` int(11) NOT NULL COMMENT '防',
`crit` int(11) NOT NULL COMMENT '暴击',
`dodge` int(11) NOT NULL COMMENT '闪避',
`fighting_capacity` int(11) NOT NULL COMMENT '战斗力',
`is_enter_war` int(11) NOT NULL COMMENT '是否参战',
`end_brooding_time` int(11) NOT NULL COMMENT '孵化完成时间',
`accelerate_brooding_gem` int(11) NOT NULL COMMENT '加速孵化需要钻石',
`blood_train_count` int(11) NOT NULL COMMENT '血 培养次数',
`attack_train_count` int(11) NOT NULL,
`anti_train_count` int(11) NOT NULL,
`crit_train_count` int(11) NOT NULL,
`dodge_train_count` int(11) NOT NULL,
`blood_add` int(11) NOT NULL COMMENT '血 培养加成',
`attack_add` int(11) NOT NULL,
`anti_add` int(11) NOT NULL,
`crit_add` int(11) NOT NULL,
`dodge_add` int(11) NOT NULL,
`created_at` int(11) DEFAULT NULL,
`updated_at` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `pet_config_id` (`pet_config_id`),
KEY `is_enter_war` (`is_enter_war`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8 COMMENT='宠物'
*/
/**
* 宠物
* @property int $id
* @property int $user_id
* @property string $pet_config_id //宠物配置ID
* @property string $name
* @property int $level
* @property int $exp
* @property int $feed//剩余喂养点
* @property int $hp //当前血条
* @property int $last_feed_update_time //上次计算喂养点时间
* @property-read int $max_hp //血条上限
* @property int $blood //血
* @property int $attack //攻击
* @property int $anti //防
* @property int $crit //暴击
* @property int $dodge //闪避
* @property int $fighting_capacity //战斗力
* @property int $is_enter_war //是否参战
* @property int $end_brooding_time //孵化完成时间
* @property int $accelerate_brooding_gem //加速孵化需要钻石
* @property int $blood_train_count //血 培养次数
* @property int $attack_train_count //攻击
* @property int $anti_train_count //防
* @property int $crit_train_count //暴击
* @property int $dodge_train_count //闪避
* @property int $blood_add //血 培养加成
* @property int $attack_add //攻击
* @property int $anti_add //防
* @property int $crit_add //暴击
* @property int $dodge_add //闪避
* @property int $created_at
* @property int $updated_at
*/
class Pet extends ActiveRecord
{
public function fields()
{
$fields = parent::fields();
$fields['hp'] = function () {
return $this->currentHp();
};
$fields['max_hp'] = function () {
return $this->maxHp();
};
return $fields;
}
public function beforeSave($insert)
{
if ($insert && (int)$this->hp <= 0) {
$this->hp = $this->maxHp();
}
return parent::beforeSave($insert);
}
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
public function rules()
{
return [
['id', 'default', 'value' => 0],
['user_id', 'required'],
['user_id', 'exist', 'targetClass' => '\common\models\User', 'targetAttribute' => 'id'],
['pet_config_id', 'default', 'value' => ''],
['name', 'default', 'value' => ''],
['level', 'default', 'value' => 1],
['exp', 'default', 'value' => 0],
['feed', 'default', 'value' => 0],
['hp', 'default', 'value' => 0],
['hp', 'number', 'integerOnly' => true, 'min' => 0],
['last_feed_update_time', 'default', 'value' => 0],
['blood', 'default', 'value' => 0],
['attack', 'default', 'value' => 0],
['anti', 'default', 'value' => 0],
['crit', 'default', 'value' => 0],
['dodge', 'default', 'value' => 0],
['fighting_capacity', 'default', 'value' => 0],
['is_enter_war', 'default', 'value' => PetUtil::NOT_ENTER_WAR],
['is_enter_war', 'in', 'range' => PetUtil::ENTER_WAR_LIST],
['end_brooding_time', 'default', 'value' => 0],
['accelerate_brooding_gem', 'default', 'value' => 0],
['blood_train_count', 'default', 'value' => 0],
['attack_train_count', 'default', 'value' => 0],
['anti_train_count', 'default', 'value' => 0],
['crit_train_count', 'default', 'value' => 0],
['dodge_train_count', 'default', 'value' => 0],
['blood_add', 'default', 'value' => 0],
['attack_add', 'default', 'value' => 0],
['anti_add', 'default', 'value' => 0],
['crit_add', 'default', 'value' => 0],
['dodge_add', 'default', 'value' => 0],
['created_at', 'default', 'value' => 0],
['updated_at', 'default', 'value' => 0],
];
}
public static function findByUserIDAndPetConfigID($userID, $petConfigID)
{
return self::findOne(['user_id' => $userID, 'pet_config_id' => $petConfigID]);
}
/**
* @param $userID
* @return static[]
*/
public static function findAllByUserID($userID)
{
return self::findAll(['user_id' => $userID]);
}
public static function findByPetID($petID)
{
return self::findOne(['id' => $petID]);
}
public static function findEnterWarPetByUserID($userID)
{
return self::findOne(['user_id' => $userID, 'is_enter_war' => PetUtil::ENTER_WAR]);
}
public function maxHp()
{
return max(1, (int)$this->blood + (int)$this->blood_add);
}
public function currentHp()
{
return max(0, min($this->maxHp(), (int)$this->hp));
}
public function attackValue()
{
return max(0, (int)$this->attack + (int)$this->attack_add);
}
public function defenseValue()
{
return max(0, (int)$this->anti + (int)$this->anti_add);
}
}