Informacje ogólne

edytuj

Colobot – gra typu RTS z elementami programowania. Dokładny opis gry znajduje się w Wikipedii.

Niniejszy podręcznik zawiera różne informacje umożliwiające ułatwienie rozgrywki poprzez m.in. ingerencje w pliki gry.

Zdecydowana większość plików gry ma charakter otwarty. Oznacza to, że pliki są zapisane w szeroko dostępnych formatach i użytkownik może je edytować za pomocą zwykłych programów tekstowych i/lub graficznych.

Struktura katalogów gry

edytuj

W głównym katalogu gry Colobot znajdują się następujące foldery: diagram, files, help, program, savegame, scene, script, textures, user. Jedynie pliki w tych folderach dają się w łatwy sposób edytować i ten podręcznik jedynie ich będzie dotyczył. Główny katalog gry zawiera również plik colobot.ini zawierający ustawienia gry.

Diagram

edytuj

Folder zawiera pliki wszystkich obrazów, które są wykorzystane w podręczniku programowania wewnątrz gry oraz w opisach misji i przedmiotów. Wszystkie pliki zapisane są w formacie mapy bitowej (*.bmp). Ich edycja nie ma jakiegokolwiek wpływu na przebieg gry, jednak przy tworzeniu modyfikacji do gry ich zmiana może okazać się przydatna.

Folder domyślnie nie zawiera żadnych plików. Przeznaczony jest on dla użytkownika i może on go wykorzystać zgodnie z własną wolą. W tym katalogu znajdują się pliki, z których korzystają programy (w CBot można programować operacje na plikach).

Folder zawiera pliki tekstowe (*.txt) zawierające wszystkie teksty pojawiające się w opisach misji czy podręczniku programowania wewnątrz gry. Tekst formatuje się za pomocą specjalnych znaczników. W celu wprowadzenia sformatowanego tekstu na początku wiersza należy wpisać \x;, gdzie x to litera oznaczająca odpowiednie formatowanie.

Niektóre z znaczników:

  • b → powoduje wyświetlenie dużego tekstu na brązowym tle
    • prawidłowa składnia: \b;Przykładowy tekst
  • t → powoduje wyświetlenie tekstu na brązowym tle
    • prawidłowa składnia: \t;Przykładowy tekst
  • s → powoduje wyświetlenie tekstu na żółtym tle
    • prawidłowa składnia: \s;Przykładowy tekst
  • tab → powoduje wyświetlenie tabeli na pomarańczowym tle
    • prawidłowa składnia: \tab;Przykładowy tekst
  • c → powoduje użycie czcionki Courier
    • prawidłowa składnia: \c;Przykładowy tekst
  • image → powoduje wyświetlenie obrazu znajdującego się w folderze diagram
    • prawidłowa składnia: \image nazwa pliku x y;

Nazwa pliku musi być podana bez rozszerzenia pliku, czyli np. obraz, a nie obraz.bmp. X i Y – szerokość i wysokość obrazu w znakach.

Program

edytuj

Folder zawiera wszystkie programy stworzone przez gracza, które zostały zapisane w folderze publicznym.

Savegame

edytuj

W tym folderze znajdują się zapisane profile użytkowników w grze. Każdy folder w katalogu savegame reprezentuje jednego użytkownika w grze. Wewnątrz folderu konkretnego użytkownika znajdują się pliki określające postęp gracza w poszczególnych trybach gry. Wszystkie pliki z postępem użytkownika mają rozszerzenie *.gam, jednak są one zwykłymi plikami tekstowymi i można je modyfikować dowolnym edytorem tekstu.

Pliki postępu:

  • face.gam → ustawienia wyglądu atronauty
  • scene.gam → plik postępu zawierający informacje o wykonanych misjach tryby fabularnego gry; zawartość pliku:
[...]
Chapter 5: Scene 3: numTry=1 passed=1
Chapter 6: Scene 0: numTry=6 passed=1
[...]

Chapter oznacza numer rozdziału, scene numer misji, numTry próby wykonania misji, a passed informację, czy dana misja jest, czy nie jest wykonana (1 – zaliczona, 0 – niezaliczona).

  • train.gam → plik postępu ćwiczeń programistycznych, struktura pliku jest taka sama jak w pliku scene.gam
  • defi.gam → plik postępu wyzwań programistycznych, struktura pliku jest taka sama jak w pliku scene.gam

Folder zawiera pliki określające przebieg misji. Wewnątrz plików znajdują się informacje o nazwie misji, położeniu określonych obiektów na mapie oraz warunków do zakończenia misji. Nazwy plików są utworzone wg zasady:

  • defixyy.txt → pliki zawierające dane wyzwań programistycznych
  • freexyy.txt → pliki zawierające dane swobodnej gry
  • scenexyy.txt → pliki zawierające dane misji (tryb fabularny)
  • trainxyy.txt → pliki zawierające dane ćwiczeń programistycznych

x oznacza numer rozdziału, a yy numer misji, np. misja "Budowanie" z Ziemi to scene102.txt

Opis pliku zawierającego dane misji znajduje się w podręczniku dot. tworzenia własnych poziomów

Script

edytuj

Folder zawiera pliki z programami, którymi zaprogramowane są obce formy życia w grze, oraz roboty, którymi nie może kierować gracz.

Textures

edytuj

Folder zawiera pliki określające topografię map w grze. Poziomy w grze są trójwymiarowe, jednak są generowane na podstawie dwuwymiarowych obrazów. Obrazy te są mapami bitowymi o wymiarach 161 x 161 pikseli. Mapy są zapisane w odcieniach szarości, im ciemniejszy kolor na mapie, tym wyższy punkt na mapie. Ponieważ poziomy gry są generowane na podstawie plików *.bmp w folderze textures, ich modyfikacja (np. za pomocą programu MS Paint) spowoduje zmianę wyglądu terenu na konkretnej mapie w grze.

Mapy bitowe z topografią terenu mają nazwę reliefxx.bmp. Pliki z nazwą resxx.bmp zawierają informację o umiejscowieniu rud tytanu/uranu oraz energii na danej mapie. Liczby xx nie mają nic wspólnego z numerami misji. Następującymi kolorami oznaczone są:

  • kolor czerwony → ruda tytanu
  • kolor żółty → ruda uranu
  • kolor zielony → energia
  • kolor zielonkawy → zakopane klucze

Modyfikując te pliki można wpływać na to, w jakim miejscu dana ruda czy energia będzie występować na mapie.

Folder zawiera pliki z poziomami stworzonymi przez gracza. Większość plików graficznych, pomocy itp. może być tworzona w tym katalogu, bez ingerencji w inne katalogi. Takie rozwiązanie zapewnia przenośność własnych poziomów.

Dokładna instrukcja tworzenia własnych poziomów znajduje się w instrukcji (plik .pdf, podręcznik w języku angielskim). Obecnie tworzony jest także podręcznik na Wikibooks na ten temat.

Kody do gry

edytuj

W celu wpisania kodów wciśnij klawisze Ctrl+Break. W lewym górnym narożniku ekranu wyświetli się pole tekstowe, w które można wpisać któryś z poniższych kodów. Po wpisaniu kodu należy wcisnąć klawisz ENTER. Ponowne wpisanie niektórych kodów dezaktywuje je.

  • winmission – wygrana misji
  • lostmission – przegrana misji
  • fullpower – naładowanie do pełna ogniwa elektrycznego, ostudzenie silnika i odnowienie osłony
  • fullenergy – naładowanie do pełna ogniwa elektrycznego
  • fullshield – naprawa osłony
  • fullrange – ochłodzenie reaktora
  • fly – umożliwia latanie
  • nolimit – możliwość wyższego wznoszenia się robotami latającymi i astronautą
  • addfreezer – silnik robota latającego dłużej się przegrzewa (dla każdego robota kod ten musi być wpisany osobno)
  • addhusky – zmniejsza wrażliwość osłony (czyli np. dłużej może być atakowany)
  • allresearch – wszystkie roboty są dostępne
  • allmission – wszystkie misje są dostępne
  • showsoluce – wszystkie rozwiązania misji są dostępne
  • invradar – mapa działa jak po wybudowaniu radaru
  • selectinsect – pozwala sterować wrogiem (lub zabezpieczonym robotem, np. w ćwiczeniach) tak jak zwykłym robotem
  • photo1 – swobodne oglądanie otoczenia kamerą "przyklejoną" do gruntu (obraz można przybliżać i oddalać za pomocą klawiszy [+] i [-] na klawiaturze numerycznej
  • photo2 – to samo, ale nie widać mapy ani panelu z informacjami o zaznaczonym robocie

Ponowne wpisanie photo1 lub photo2 wyłącza tryb przeglądania

  • showstat – wyświetlenie w rogu ekranu informacji technicznych: liczby klatek na sekundę, generowanych trójkątów i trybu graficznego
  • showpos – wyświetlenia w rogu ekranu pozycji aktywnego obiektu. Działa tylko przy włączonym showstat.

Kontrola Obcych

edytuj

Kod selectinsect umożliwia ręczne sterowanie Obcymi formami życia, jak również ich programowanie. Każdy Obcy po uruchomieniu misji wykonuje program rozkazujący mu atakowanie astronauty/robotów/budynków. Wyłączenie programu wykonywanego przez Obcego dezaktywuje go. Poniżej znajdują się umiejętności poszczególnych Obcych:

Nazwa Kategoria Możliwości
Mrówka AlienAnt Strzelanie
Pająk AlienSpider Wybuchy samobójcze
Osa AlienWasp Latanie, chwytanie i puszczanie (także w locie)
Robal AlienWorm UWAGA: Nie ma instrukcji wirusującej. Roboty wirusują się przez kontakt z robalami!
Królowa Obcych AlienQueen Składa jaja z których później wykluwają się obcy. (właściwie to każdy programowalny obiekt może tworzyć jaja)

Obce formy życia można programować tak jak zwykłe roboty. Osa może przejąć zadania transportera latającego. Zaletą Os jest to, że są wodoodporne oraz brak silnika sprawia, że nie "przegrzewają" się, dzięki czemu mogą cały czas pozostawać w powietrzu.

Przykładowy program rozkazujący Osy wyszukanie rudy tytanu i przetopieniu jej na tytan w hucie:

extern void object::Tytan()
{

	object rudatyt; // deklaracja zmiennej
	object huta; // deklaracja zmiennej
	
	rudatyt = radar(TitaniumOre); // znajdź położenie rudy tytanu
	goto(rudatyt.position); // idź do rudy tytanu
	grab(); // podnieś ją
	
	huta = radar(Converter); // znajdź położenie huty
	goto(huta.position); // idź do niej
	drop(); // upuść rudę tytanu
       move(-2.5); // cofnij się 2,5 metra 
}

Produkcja niektórych obiektów

edytuj

Roboty i Obcy mogą produkować niektóre Kategorie. Poniższy kod zawiera prezentację wszystkich widzialnych, generowalnych obiektów:

extern void object::Produkuj()
{
	for(int i=0;i<19;i++){
		move(2); //Odstep pomiedzy przywolanymi obiektami
		
		switch(i){
			//wszystkie obiekty przenośne
			case 0:produce(position, orientation, TitaniumOre, "");break;	//Ruda tytanu
			case 1:produce(position, orientation, UraniumOre, "");break;	//Ruda uranu
			case 2:produce(position, orientation, Titanium, "");break;		//Tytan
			case 3:produce(position, orientation, PowerCell, "");break;		//Ogniwo elektryczne
			case 4:produce(position, orientation, NuclearCell, "");break;	//Atomowe ogniwo elektryczne
			case 5:produce(position, orientation, OrgaMatter, "");break;	//Materia organiczna
			case 6:produce(position, orientation, BlackBox, "");break;		//Czarna skrzynka
			case 7:produce(position, orientation, TNT, "");break;			//Ladunek wybuchowy
			case 8:produce(position, orientation, KeyA, "");break;			//Klucz A
			case 9:produce(position, orientation, KeyB, "");break;			//Klucz B
			case 10:produce(position, orientation, KeyC, "");break;			//Klucz C
			case 11:produce(position, orientation, KeyD, "");break;			//Klucz D

			//Mina i punkt kontrolny
			case 12:produce(position, orientation, Mine, "");break;			//Mina
			case 13:produce(position, orientation, WayPoint, "");break;		//Punkt kontrolny
			
			//Wszyscy Obcy bez jaja
			case 14:produce(position, orientation, AlienQueen, "");break;	//Krolowa Obcych
			case 15:produce(position, orientation, AlienAnt, "");break;		//Mrowka
			case 16:produce(position, orientation, AlienSpider, "");break;	//Pajak
			case 17:produce(position, orientation, AlienWasp, "");break;	//Osa
			case 18:produce(position, orientation, AlienWorm, "");break;	//Robal
			
			default:
		}
	}
}

W komendzie produce(position, orientation, category,function):

  • position → zmienna typu point określająca lokalizację obiektu generowanego. W powyższym kodzie oznacza również pole obiektu wykonującego funkcję Produkuj() (Robot/Obcy) z pominięciem this.position. Kierunek pionowy (z) jest pomijany.
  • orientation → zmienna typu float orientacja utworzonego obiektu generowanego. Również w domyśle pole obiektu wykonującego funkcję Produkuj() (Robot/Obcy) z pominięciem this.orientation
  • category → kategoria obiektu do przywołania, np. Mine przywołuje minę
  • function → funkcja wykonywana przez obiekt generowany, działa tylko dla Obcych. W powyższym przykładzie nowi Obcy nie robią nic.

Matematyka

edytuj

W języku CBOT są dostępne następujące funkcje matematyczne:

  • sin, cos, tan (funkcje trygonometryczne)
  • asin, acos, atan (funkcje odwrotnie trygonometryczne arcus-...)
  • abs (wartość bezwzględna)
  • pow, sqrt (potęgowanie, pierwiastek kwadratowy)
  • rand (wartość losowa z zakresu 0–1)

Przykład wykorzystania:

extern void object::Oblicz_i_strzel()
{
      object target = radar(AlienAnt);
      turn(direction(target.position));
      float a = distance2d(target.position, position); // odległość od celu
      float b = 2; // przybliżona wysokość działa
      float c = sqrt(pow(a, 2) + pow(b, 2)); // przeciwprostokatna
      float angle = asin(a/c);
      aim(angle);
      fire(1);
}

Ciekawostki

edytuj
  • Można programować nawet człowieka! Wystarczy, że odpowiednio zmodyfikujemy pliki misji (lub własny poziom). Zainteresowanych takimi zmianami odsyłam do odpowiedniej sekcji podręcznika dot. własnych poziomów.
  • Wbrew informacjom w SatCom, nie ma takich stałych jak UraniumSite, TitaniumSite, EnergySite. Kompilator CBot-a w ogóle nie zna takich symboli. Zamiast tego występują odpowiednio:
    • UraniumSpot (znacznik występowania rudy uranu)
    • TitaniumSpot (znacznik występowania rudy tytanu)
    • PowerSpot (znacznik występowania energii).

Zobacz też

edytuj