Strona 1 z 1

[Projekt] Eventy w folwarkach

PostNapisane: 19 sie 2021, o 21:45
przez Prokrustes
Celem projektu jest dodanie w systemie folwarków funkcjonalności eventów wpływających dodatnio lub ujemnie na produkcję danego produktu.

Stworzona została nowa tabela na bazie danych:

CREATE TABLE dsg_folwark_events (
eventId integer AUTO_INCREMENT,
produkt varchar(255),
efekt integer,
opis varchar(255),
poczatek datetime,
koniec datetime,
primary key (eventId)
)


... oraz definiujemy pierwszy event ...

INSERT INTO `dsg_folwark_events` (`eventId`, `produkt`, `efekt`, `opis`, `poczatek`, `koniec`) VALUES (NULL, 'pszenica', '50', 'W Księstwie Sarmacji trwają żniwa. Przez cały tydzień produkcja pszenicy jest większa o 50%.', '2021-08-23 00:00:00', '2021-08-29 23:59:59');


W dalszych krokach trzeba to obsłużyć w PHP.

Re: [Projekt] Eventy w folwarkach

PostNapisane: 19 sie 2021, o 22:15
przez Prokrustes
Po pierwsze chcemy by użytkownicy zostali poinformowani o trwających eventach.

Tworzymy nowy model (klasę modelu) dotyczącą eventów. W zasadzie jest to po prostu porządkowa przestrzeń nazw.
W modelu definiujemy jedną metodę która zwróci nam trwające eventy.

class Models_Folwark_Event {
public static function getOngoingEvents() : array {
global $database;
$database->query("SELECT * FROM dsg_folwark_events WHERE NOW() BETWEEN poczatek AND koniec");
return $database->getDane();
}
}


W klasie kontrolera pobierzemy te dane:

$view['events'] = Models_Folwark_Event::getOngoingEvents();


dzięki czemu będą dostępne dla "widoku" - czyli dla wyświetlanej użytkownikom strony.

W widoku ... w uproszczeniu wyświetlamy opisy trwających eventów

{% for event in events %}
{{ event.opis }}
{% endfor %}


co przekłada się na:


event.jpg


W kolejnym kroku trzeba nieco ulepszyć to jak informacja o evencie jest wyświetlana.

Re: [Projekt] Eventy w folwarkach

PostNapisane: 19 sie 2021, o 22:37
przez Prokrustes
Wyszło przy okazji, że fajnie by było mieć nazwę eventu.
Tak więc poszerzamy tabelę na bazie:

ALTER TABLE `dsg_folwark_events` ADD `nazwa` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `eventId`;


i aktualizujemy definicję eventu:

UPDATE `dsg_folwark_events` SET `nazwa` = 'Sarmackie Żniwa' WHERE `dsg_folwark_events`.`eventId` = 1;


W widoku używamy trochę czarnej magii "SemanticUI" (martwej alternatywy dla bootstrapa)

{% if events %}
<div class="ui grid">
{% for event in events %}
<div class="row">
<div class="column">
<div class="ui icon message">
<i class="star icon"></i>
<div class="content">
<div class="header">
{{ event.nazwa }}
</div>
<p>{{ event.opis }}</p>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
{% endif %}


I mamy nieco lepszy komunikat:


event2.jpg


Tak więc... użytkownik jest już powiadomiony o evencie jeżeli tylko wejdzie na stronę folwarku.
W dalszej kolejności musimy się zająć tym, żeby efekt eventu faktycznie był brany pod uwagę przy przeliczeniach produkcji.
Chcemy też by informacja o evencie publikowała się na Discorda przy pierwszym przeliczeniu uwzględniającym event.

Re: [Projekt] Eventy w folwarkach

PostNapisane: 19 sie 2021, o 22:41
przez AFvTD
3 pytania:

1. Czy możliwe będzie, aby w jednym czasie trwał więcej niż jeden event wpływający na produkcję?
2. Jeżeli odpowiedź na pytanie 1. jest twierdząca, to czy podobne efekty będą sumować się, czy brany będzie pod uwagę tylko największy?
3. Jeżeli odpowiedź na pytanie 1. jest twierdząca - na jakiej zasadzie w przypadku dużej ilości trwających eventów, będzie wybierany ten, pokazujący się w "infoboxie"?

Re: [Projekt] Eventy w folwarkach

PostNapisane: 20 sie 2021, o 07:31
przez Prokrustes
Na czuja bym powiedział, że wyciąganie wielu eventów to już jest więcej niż w życiu będzie potrzebne :D
Częściej nie będzie komu tego zaplanować niż żeby planować od razu wiele.

Natomiast jeżeli tak by się zdarzyło to efekty będą się "sumowały" - przy czym wiadomo mogą mieć wpływ na inne elementy folwarku.

Przy obecnej pętli w widoku pojawi się "x" infoboxów. Gdybym traktował poważnie ryzyko wystąpienia wielu eventów to pewnie bym zmienił tą pętlę żeby infobox był jeden a w nim "x" eventów.

Re: [Projekt] Eventy w folwarkach

PostNapisane: 20 sie 2021, o 12:19
przez AFvTD
A co z eventami typu deszcz, susza, awaria, szarańcza?

Re: [Projekt] Eventy w folwarkach

PostNapisane: 20 sie 2021, o 20:21
przez Prokrustes
AFvTD napisał(a):A co z eventami typu deszcz, susza, awaria, szarańcza?


Co z nimi ? Nie widzę różnicy :D
Awaria tyle się różni, że prędzej powinna być indywidualna - per konkretny folwark lub ich grupę.
Jakieś zjawisko/kataklizm mogłyby być regionalne.

To jest kolejny ficzer do zaimplementowania ewentualnie. Myślę, że jakiś młody zdolny programista mógłby w folwarkach pogmerać bo to niczego "poważnego" nie wywali.

A kontynuując prace...

W jobie który codziennie w nocy przelicza produkcję dodano wywołanie metody pobierającej dane eventów.
Dodano kolejną metodę która te rekordy przekształca w tablicę w której kluczem jest nazwa produktu a wartością efekt (też przekształcony w mnożnik).

np.
$tab['pszenica'] = 1.5;
$tab['swinie'] = 0.5;

Mnożnik dodano do formuły wyliczającej wielkość produkcji.
Projekt zostanie zamknięty jak z poniedziałku na wtorek to się dobrze przeliczy ;)