Colobot Forum - International Colobot Community

Full Version: CBot - użycie i zmiana licencji
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Czy warto pisać do Epsitec z prośbą o zmianę licencji dla języka CBot na licencję, która pozwala na użycie go w nie GPL'owskich projektach? Przynajmniej LGPL. CBot powinien zyskać wtedy na popularności. Sam chciałbym mieć taką możliwość. W przyszłości planuję stworzyć grę w której można coś w łatwy sposób programować podobnie jak w Colobot. Jednocześnie podoba mi się składnia języka CBot a chodzi mi o to, żeby grając w grę, uczyć się programowania.
Chciałbym użyć CBot ale nie chcę robić projektu pod GPL.

Jeśli ma to sens tj. pisanie do nich to (pytania do programistów):
-czy CBot jest kosztowny dla CPU? Jaka jest jego prędkość?
-czy ewentualna implementacja CBot'a  w innym projekcie byłaby trudna?
-czy ma to jakiś sens?
CBOT jest integralną częścią gry i w chwili obecnej licencja to jest najmniejsze zmartwienie, zwłaszcza że i tak pewnie twoja kopia CBOTa nie byłaby 1:1, a sam CBOT pożycza sobie składnię z C++ i Javy'y, które to pożyczają sobie składnię z C... Języków nie można patentować/nie są chronione prawem jeśli dobrze pamiętam z wykładów, ale głowy nie dam, proszę mnie nie cytować. Odpowiadając na twoje pytania:
1. Czy jest kosztowny to nie wiem, na pewno jest okropnie wolny. Kiedyś próbowałem zrobić proste zadanie algorytmiczne i podobny program wykonujący się w Pythonie w chwilę, w CBOT wykonywał się ponad chyba 15 minut (nie czekałem do końca). To jednak wynika z limitu instrukcji wykonywanych w jednostce czasu jeśli dobrze pamiętam, ale nie wiem, jak będzie działać bez. Na pewno demonem prędkości nie będzie, bo to język interpretowany i jest warstwę wyżej niż C++ i z pewnością kilka lig niżej w optymalizacji niż "prawdziwe" języki, nawet skryptowe.
2. "Trudne" to pojęcie bardzo względne. Zależy od twojej wiedzy, umiejętności, doświadczenia, specyfiki projektu itd. Raczej jest to coś na co nawet doświadczony programista musiałby poświęcić z miesiąc, pół roku, lub więcej. W samym Colobot'cie nie chce mi się sprawdzać dokładnych liczb, ale CBOT to spory procent kodu, jeśli nie połowa. Jeśli chcesz wykorzystać Colobotową implementację, to nie jest to możliwe, bo CBOT jest zbyt mocno zintegrowany z kodem gry, chociaż już jest z tym jakiś postęp i nawet można odpalić CBOTa z konsoli, ale dalekie to od użyteczności.
3. Zależy czego oczekujesz, co już umiesz i jak dużo masz czasu do spożytkowania.
Dzięki za odpowiedź.
Moje umiejętności nie są jakieś duże tj. piszę obecnie platformówkę w actionscript (bez silnika gry, dynamiczna zmiana poziomów). Powiem, że wiele się uczę przy tym projekcie (logika programu, optymalizacja), wiele rzeczy jest dla mnie nowych. Nie mam jakiegoś większego doświadczenia z programowaniem (pisałem jeszcze jakieś proste mody do hl2 i proste programy w C++). W przyszłości muszę się douczyć C++, potem C#.
Chodzi mi raczej o to, czy interesowanie się CBot'em ma sens. Jeśli tak, to mogę spróbować przeanalizować jego działanie i nauczyć się go implementować. Jeśli miałbym nie dostać licencji dla CBot'a, to szkoda czasu.

Piszesz, że jest wolny. Pytanie tylko, czy podczas tego algorytmu co mu zleciłeś, CPU "wchodził na wyższe obroty". Bo jeśli wolno sobie liczy, ale przy tym skromnie używa CPU, to ok. Wystarczy do prostych programów wbudowanych w grę - takich jak w Colobot.

Ewentualnie, czy znasz coś podobnego do CBot'a, jakiś skrypt, który ma podobną składnię jak C++ i może być użyty w grze jak CBot w Colobot?

Myślałem, że dobrze by było zrobić użytek z Cbot'a i dać mu więcej sławy. Pytanie czy warto się w to bawić.
Wolno liczy przez limit instrukcji, który jest właśnie po to, żeby procesora za dużo nie zużywał.

Mógłbyś spróbować z http://www.angelcode.com/angelscript/ .
Limitem prędkości CBOTa nie jest procesor sprzętowy, a "wirtualny", to jest ilość instrukcji na sekundę (lub raczej na klatkę). Dopóki on jest limiterem, to CPU nie będzie wchodzić na 100% (nie z powodu programu, procesor odpowiada też za grafikę, logikę, etc i to one mogą dopełnić do 100%). Można to zmieniać funkcją ipf();, ale to niekoniecznie musi dać żądany efekt.
Z licencjonowaniem to i tak jesteśmy zależni od Epsitec, oni nadal są właścicielami praw do marki, zmiana licencji części kodu też prawdopodobnie musiałaby odbyć się za ich zgodą, Chociaż i ja nie jestem prawnikiem i mogę się mylić w kwestiach prawnych. Mimo wszystko nie nastawiałbym się na to, żeby ciut przymknęli licencję na kod.
Wątpię by nasza licencja pokrywała kwestie związane z patentowaniem składni języka. Ta licencja nadana jest bardzo, że tak określę, "analogowo", prostolinijnie, na sam kod i wszelkie elementy wchodzące w skład gry. W tej licencji nic nie jest wyszczególnione odnośnie pojawiających się w grze postaci, obiektów, ogólnego scenariusza, muzyki, itp.

W efekcie myślę, że składnię CBOT można by było z powodzeniem zaimplementować w dowolnym projekcie na dowolnej licencji pod warunkiem że autor dokona własnej jej implementacji nie używając do tego fragmentów kodu Colobota przy pisaniu interpretera/kompilatora dla tego języka. Teoretycznie implementacja ta mogłaby nosić też nazwę "CBOT" bez ryzyka kolizji z naszą licencją, gdyż jedyna nazwa na którą mamy z EPSITEC wyłączne prawo to "colobot" (choć tutaj z kolei wyjątkiem jest chyba tylko indyjski robot do malowania ścian i sufitu, o którym kiedyś wspominałem dając linka do filmu na YT Tongue ). Jednakże nie jestem prawnikiem, a tylko zwykłym ludzkim organizmem, więc mogę się mylić. Na moją logikę to ma sens.
Języków programowania praktycznie nie można ani patentować, ani chronić prawami autorskimi. Jedyne co działa to ochrona znaku towarowego na nazwę (tak jest np. z nazwą języka Java i używaniem go) i ochrona praw autorskich do kodu źródłowego biblioteki standardowej, co obecnie jest coraz rzadziej stosowane. Z tego co wiem, Epsitec nie może zabronić komukolwiek napisania własnej wersji interpretera języka CBot do własnej (nawet komercyjnej) gry, a sama gra nie posiada biblioteki standardowej w postaci kodu źródłowego w języku CBot, bo wszystko jest wbudowane w Colobota. Jedyny problem mógłby być z używaniem nazwy CBot. Jeśli bardzo chcesz użyć CBota we własnej grze, można spytać Epsitec czy ci na to pozwolą. Raczej nie powinni robić problemów.

Wbrew temu co się powszechnie mówi, istnieje legalny sposób na obejście licencji GPL, ale nie wydaje mi się, abyś chciał go tutaj zastosować. C++ nie wspiera refleksji i dynamicznego linkowania, więc jest to dość uciążliwe. Musiałbyś się posiłkować dodatkowymi bibliotekami. Poza tym, obecna implementacja CBota wymaga przepisania. Raczej nie chciałbyś używać tego, co jest w Colobocie. Można się zastanowić nad napisaniem zewnętrznego parsera i interpretera CBota, który będzie na innej licencji.
Skorzystaj z Lua. Chyba nie ma lepszego języka, by zrobić to co chcesz zrobić. Lua jest bardzo popularnym i łatwym językiem, wiele gier, które pozwalają graczom na "doprogramowanie" zawartości korzysta właśnie z Lua. Jeśli język w twojej grze, koniecznie musi mieć bardzo podobną składnię do C++ lub Java, stwórz swój własny język wzorując się CBocie. CBot jest ściśle związany z Colobotem i większość instrukcji w CBocie dotyczy robotów (motor, grab, radar), więc nie wiem jak sobie wyobrażasz przeniesienie CBota do innej gry. Z mojego punktu widzenia, jest to niemożliwe.

Odpowiadając na pytania:
1. CBot jest wolny.
2. Bardzo.
3. Nie ma absolutnie żadnego sensu. Skorzystaj z jakiegoś popularnego języka skryptowego np. Lua, albo stwórz własny język.
(01-15-2017, 02:24 PM)tomaszkax86 Wrote: [ -> ]Poza tym, obecna implementacja CBota wymaga przepisania. Raczej nie chciałbyś używać tego, co jest w Colobocie.
I to w zasadzie podsumowuje całą tą dyskusję Tongue

Niemniej, wbrew pozorom sam interpreter CBota nie jest już zintegrowany aż tak mocno z silnikiem samej gry, nawet część biblioteki standardowej która nie operuje bezpośrednio na obiektach w grze jest przeniesiona do katalogu interpretera właśnie po to żeby można jej było bez problemu użyć w zewnętrznych projektach.

Szybkość wykonywania programów w grze tak jak już kilka osób wspomniało jest ograniczona sztucznie nałożonym limitem instrukcji wykonywanych w jednej klatce animacji, który jest konieczny po to aby programy w CBocie nie mogły obniżać nam FPSów. W przyszłości można pomyśleć o wyciągnięciu programów w CBocie na oddzielny wątek, co pozwoliłoby programom wykonywać ewentualne bardziej skomplikowane obliczenia niezwiązane bezpośrednio ze światem gry równocześnie z renderowaniem.
Jeśli ktoś chciałby zobaczyć jak zachowuje się CBot bez tego ograniczenia, to przy włączonej kompilacji testów oprócz głównej gry dostajemy także program CBot_console który jest po prostu konsolowym interpreterem CBota, uruchamiającym program wczytany z stdin. Dostępne są praktycznie wszystkie instrukcje które nie są powiązane z grą (mamy np. operacje matematyczne i operacje na stringach, ale brakuje radar, move itd.). Źródła można znaleźć tutaj: https://github.com/colobot/colobot/blob/...onsole.cpp Jest to też wzorcowy przykład jak zaimplementować CBota do innego programu.

Jeśli chodzi o samą wygodę użycia CBota w innych zastosowaniach, to jedyną rzeczą która jest moim zdaniem dość uciążliwa na dłuższą metę jest konieczność pisania oddzielnej funkcji kompilacji do każdej instrukcji wbudowanej w język, dużo wygodniej byłoby zastąpić zwykłą deklaracją przyjmowanych argumentów i zwracanego typu. Przykład dodawania własnych funkcji do języka można znaleźć w źródłach CBot_console i w src/script/scriptfunc.cpp w źródłach głównej gry.


EDIT: Jeśli kogoś interesują konkretne wartości:

Program testowy:
Code:
extern void PrimeTest()
{
    for(int i = 0; i < 250; i++) {
        bool prime = true;
        for(int j = 2; j < i; j++) {
            if (i%j == 0) {
                prime = false;
                break;
            }
        }
        if(prime) {
            message("Prime: "+i);
        }
    }
}
  • w grze, bez zmiany ipf (przy stabilnych 60 FPS, mierzone funkcją abstime()) - 15.14 s
  • w grze, ipf=10000 (maksymalna dozwolona wartość jeśli mnie pamięć nie myli) - 0.16 s
  • w konsoli, ipf=∞ (mierzone przez time) - 0.05 s
  • ten sam program napisany w C++ - 0.003 s (ale powiedziałbym że faktycznie jest to <0.001s i to jest tylko niedokładność odliczania czasu, bo zwiększenie 250 do 1000 ani zmniejszenie do 50 nie daje zauważalnego efektu)
@Smok Lua ma bardziej składnię Pythonową niż Cppową, a jemu chodzi podejrzewam właśnie o składnię CBOTa. AngelScript ma takie same zastosowania jak Lua, a jest bardziej zbliżony do C++ (ma nawet pointery).
Dzięki za rozjaśnienie.

Tak chodzi mi o składnię bardzo podobną do C++, dlatego nie brałem pod uwagę Lua czy Python. Generalnie chodzi mi o coś prostego. Znalazłem też podobne pytanie na stackoverflow.

Moje użycie języka skryptowego byłoby podobne do CBot'a w Colobocie. Miałbym własne wersje niektórych funkcji np. move(). Idea jest bardzo podobna.

Języka nie można patentować, ale tu chodzi o licencję na pliki źródłowe. Pytanie tylko jak bardzo by były zmienione, gdybym je wyodrębnił z Colobot'a lub gdybym użył tego CBot console version (nie wiedziałem o tej wersji, wy zrobiliście czy Epsitec?). Nie wiadomo ile % kodu z Colobota zostałoby na końcu i czy licencja GPL nadal by obowiązywała.
CBot ma coś takiego jak 'register function' i tam są te wszystkie specjalne funkcje z gry. Prawdopodobnie w swojej grze miałbym coś identycznego. Wykonanie tych funkcji byłoby robione przez grę, nie przez skrypt.

W sumie macie rację, może lepiej jest użyć czegoś szybszego. Na początku myślałem o czymś dziecinnie prostym, ale z kolei bardziej zaawansowani użytkownicy mogą chcieć czegoś więcej. Można dać coś co jest proste, a zarazem zaawansowane.

Ten AngelScript może być interesujący. W przyszłym czasie postaram się trochę o nim poczytać.


P.S. Planujecie w przyszłości wymienić CBot na coś innego (np. w Colobot 2)?
Jeżeli się uda z refaktoringiem, to owszem, nawet w GOLD będzie można dodać inny język jako mod, najpewniej Lua z racji popularności w grach tego języka.
W Gold jest pomysł dodania Lua jako dodatkowego języka, jeśli będzie to wykonywalne to także dodawanie innych języków jako pobieralne mody (nie jest to jednak pewne). Co do Colobot 2 to na razie brak szczegółów, skupiamy się bardziej na rozwijaniu tego co jest obecnie, a o sequelach/prequelach/spinoffach/etc pomyśli się w swoim czasie.