Zrobiłem klasyczną apkkę w stylu osadnicy.
https://github.com/kordix/osadnicy
Mam tu trzy surowce i magazyny mogę robić upgrade i surowce nie mogą przekroczyć maksymalnego stanu.
Front jest zrobiony we Vue.
Chciałem się pokusić o logowanie się przez api ale ostatecznie przeniosłem routy do web.php
Surowce się naliczają na podstawie czasu od ostatniego update'a
public function updatestats(Request $request)
{
$id = Auth::id();
$time = Stat::find($id)->updated_at;
$wood = Stat::find($id)->wood;
$woodfactor = Stat::find($id)->woodfactor;
$stone = Stat::find($id)->stone;
$stonefactor = Stat::find($id)->stonefactor;
$iron = Stat::find($id)->iron;
$ironfactor = Stat::find($id)->ironfactor;
$interval = Carbon::now()->diffInSeconds($time);
$woodamount = $interval * $woodfactor;
$stoneamount = $interval * $stonefactor;
$ironamount = $interval * $ironfactor;
Stat::find($id) ->update([
'wood' => $wood += $woodamount,
'stone' => $stone += $stoneamount,
'iron' => $iron += $ironamount,
]);
}
Co mnie tu razi to analogia dotycząca surowców. Wszystkie działają tak samo różnica jest właściwie tylko w nazwie.
Już lepiej mam coś zrobione na froncie w funkcji która sprawdza czy stan nie przekracza magazynu:
checkMax(){
let self = this;
let resources=['wood','stone','iron'];
for(let i=0;i<resources.length;i++){
let operand = resources[i];
let max = self.dane[operand+'Store']*100+200;
if (self.dane[operand] > max){
self.dane[operand]=max;
console.log('działa');
}
}
}
Ale pytanie czy można to zrobić w ogóle jakoś inaczej?
Jeszcze myślę jaka najlepsza byłaby tu baza danych, teraz migracja wygląda tak:
Schema::create('stats', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->float('wood')->default(100);
$table->float('stone')->default(0);
$table->float('iron')->default(0);
$table->float('gold')->default(0);
$table->float('woodLevel')->default(1);
$table->float('stoneLevel')->default(1);
$table->float('ironLevel')->default(1);
$table->integer('woodStore')->default(1);
$table->integer('stoneStore')->default(1);
$table->integer('ironStore')->default(1);
$table->timestamps();
});
Pytanie czy trzeba robić tyle pól czy jakoś jednym polem ograć surowce, może lepiej by było mapowanie obiektu JSON jako string do jednego pola?