207 lines
6.4 KiB
PHP
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);
|
|
}
|
|
}
|