Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 
Polski Portal COLOBOTa
COLOBOT Polish Portal

COLOBOT 2 - Dodajcie do fabuły misję na czas.

cyklopek11 - 25-08-2008, 15:55
Temat postu: Dodajcie do fabuły misję na czas.
Ostatnio wpadłem że można colobota zrobić bardziej ciekawym i stworzyć w nim misję gdzie trzeba coś zrobić w ściśle określonym czasie np. pozabijać wszystkie mrówki. Jeśli się czas skończy misja kończyłaby się niepowodzeniem. Colobot nie ma takich warunków zakończenia misji ale taki warunek można bardzo łatwo stworzyć mianowicie: gdzieś w ukrytym miejscu gdzie astronauta ani inny robot nie da rady się pojawić tworzymy działo i robota cel (TargetBot) z wycelowanym na niego działem. W pliku ze misją dodajemy linijkę że jeśli EndMissionTake pos= ... dist=... type=TargetBot lost=0.
Następnie tworzymy prosty program timer odmierzający czas i ewentualnie informujący że mamy jeszcze tyle a tyle czasu na wykonanie misji i implementujemy go do działa run=1. Gdy czas minie działo rozwala TargetBot'a czyli misja kończy się niepowodzeniem. Jeśli pozabijamy wszystkie mrówki (linijka EndMissionTake pos=... dist=... type=AlienAnt min=0 max=0) i zdążymy odlecieć statkiem to wygrywamy misję.:-)

mac1e7 - 26-08-2008, 01:54
Temat postu: RE: Dodajcie do fabuły misję na czas.
Wystarczy użyć SetTimer, if (czy czas się skończył - jeśli tak : KillTimer i EndMission) ;)
cyklopek11 - 27-08-2008, 12:37
Temat postu: RE: Dodajcie do fabuły misję na czas.
Mógłbyś sprecyzować???
mac1e7 - 27-08-2008, 18:19
Temat postu: RE: Dodajcie do fabuły misję na czas.
Napisałem komendy z C++ które należy użyć aby uzyskać taki efekt. Dokładnie nie widziałem jak zbudowane są misję w Colobocie (jakoś się w to nie bawiłem) ale ktoś kto misje robi powinien się zorientować o co chodzi ;)

Ale wygląda to tak : najpierw SetTimer(czas) aby ustawić limit czasu. Potem używając zapętlonego if sprawdzamy czy czas się skończył, jeśli nie - zwraca 0, jeśli tak to 1 które odblokowuje dalszy ciąg if`a a więc KillTimer aby nie było odliczania od 0 w kolejnym podejściu i EndMission aby zakończyć misję :)

cyklopek11 - 28-08-2008, 11:38
Temat postu: RE: Dodajcie do fabuły misję na czas.
Tylko jak Ty chcesz zakończyć misję z kodu programu??? Nie ma takiej opcji w Colobocie!!! Chyba że masz kod źródłowy do niego:o
mac1e7 - 28-08-2008, 14:29
Temat postu: RE: Dodajcie do fabuły misję na czas.
Hmm w takim razie nie mam innego pomysłu więc najprawdopodobniej jest to niemożliwe...
cyklopek11 - 28-08-2008, 15:12
Temat postu: RE: Dodajcie do fabuły misję na czas.
Ale robiąc to tak jak ja to opisałem można stworzyć misję na czas:)
mac1e7 - 28-08-2008, 19:20
Temat postu: RE: Dodajcie do fabuły misję na czas.
Co do twojego sposobu... może się zdarzyć kilka bugów np. program działa może się nie włączyć albo jakiś obcy rozwali target bota :) Poza tym raczej nie ma miejsc do których nie da się w żaden sposób dostać... a i jeszcze jedno da się włączyć program w robocie który nie jest znaleziony?
adiblol - 28-08-2008, 21:13
Temat postu: RE: Dodajcie do fabuły misję na czas.
da się na robocie z selectable=0. Co do zniszczalności to można zrobić magnifyDamage=0 i wtedy niezniszczalny.
mac1e7 - 28-08-2008, 22:04
Temat postu: RE: Dodajcie do fabuły misję na czas.
@up to sprzeczne z :

Cytat:
Gdy czas minie działo rozwala TargetBot'a czyli misja kończy się niepowodzeniem.


robot MUSI być zniszczalny ;)

adiblol - 13-09-2008, 21:00
Temat postu: RE: Dodajcie do fabuły misję na czas.
NIEKONIECZNIE. Można dać niezniszczalnego TargetBot'a i przed nim minę. Przykład:

Kod:
// w sekcji obiektów (gdzieś po BeginObject)
CreateObject pos=100;230 dir=0 type=TargetBot selectable=0
CreateObject pos=100;235 dir=0 type=Mine

// przy warunkach misji
EndMissionTake pos=100;235 dist=1 type=Mine lost=0


I program dla bota:

Kod:
extern void object::Timer() {
float limit=300; //limit czasu w sekundach
float remaining;
float endtime;
float lastdisp;
float showinterval=30;
while(ismovie()!=0) wait(0.5); //możesz podstawić inną wartość w zależności od oczekiwanej precyzji.
endtime=abstime()+limit;
message("Ta misja jest na czas. Masz "+limit+" sekund czasu na jej wykonanie.");
message("Co jakiś czas będzie wyświetlać się pozostały limit czasu.");
while(true) {
remaining = endtime-abstime();
if (remaining<60) showinterval=10;
if (remaining<20) showinterval=5;
if (remaining<7) showinterval=1;
if (remaining<0) break;
if (lastdisp>showinterval) {
message("Pozostało czasu: "+remaining+" sekund.");
lastdisp=0;
}
wait(1);
lastdisp++;
}
message("Czas minął. Za chwilę misja zakończy się niepowodzeniem!");
move(5);
}


Teraz pisałem z głowy, jutro sprawdzę w praktyce...

mac1e7 - 14-09-2008, 01:22
Temat postu: RE: Dodajcie do fabuły misję na czas.
ok ale co jeśli coś/ktoś rozwali tą minę? :D
adiblol - 14-09-2008, 10:00
Temat postu: RE: Dodajcie do fabuły misję na czas.
Całą konstrukcję osłonić barierkami. A materia organiczna mrówki czy odłamki pająka nie zdetonują miny. Gorzej jak robal zaatakuje robota (robale mogą przechodzić przez wszystko). Wersja ekstremalna: dodać DefenseTower :D

Aha. W swoim poście zapomniałem przy tworzeniu TargetBota dorobić magnifyDamage=0 .

[dodano]
Nie obeszło się bez przeróbek (były błędy). W załączniku jest przykład, który należy wypakować do jakiegoś folderu misji użytkownika.

adiblol - 14-09-2008, 19:19
Temat postu: RE: Dodajcie do fabuły misję na czas.
Słuchajcie: właśnie wpadłem na genialny w swojej prostocie pomysł: zamiast miny nie dawać NIC i przerobić tak kod misji żeby po wyjechaniu TargetBota z pewnego obszaru kończyła się misja. Rozwiązanie idealne bo dzięki niemu nic nie zagraża systemowi (jak ma magnifyDamage=0). ALE bota może "coś" przepchać (np. uderzająca osa albo bot gracza (masochizm :) )) więc parametr "dist" komenty EndMissionTake musi być odpowiednio duży tak aby nawet po przepchaniu nic się nie stało a bot wtedy wróciłby na swoją starą pozycję dzięki programowej kontroli.

Przy okazji wpadłem na to jak można zrobić WYGRANĄ z warunkami (np. musimy bronić się przez określony czas - po tym czasie misja wygrana, a nie musimy wybijać owadów). Po prostu bot poleceniem produce tworzy... powiedzmy... BlackBoxa po upływie określonego czasu, engine reaguje (od warunków min=1 max=1) ale jeśli nie zdołamy się obronić przez określony czas to engine Colobota wykryje śmierć astronauty (lost=0).
ALE w ten sposób można oszukiwać np. tworząc BlackBoxa poleceniem produce przy pomocy bota gracza.

Teraz analizując pierwszą i drugą część postu stwierdziłem że da się ominąć też ten problem. Po prostu po upływie określonego czasu bot przejedzie do strefy w której obecność spowoduje wygraną. Trzeba tylko uważać żeby nie dało się bota "przepchać", tzn. strefa musi być odpowiednio daleko od punktu startowego. I bot musi być "niewytwarzalny" czyli Tech (inżynier), TargetBot albo PractiseBot.

Oba programy mogą być takie same, tylko sterowanie pojawiającymi się komunikatami przy pomocy cmdline (np. cmdline(1)==1 wtedy tryb przegranej, cmdline(1)==2 wtedy tryb wygranej) - nie zmieniałoby to nic prócz komunikatów.

UWAGA: Last update: co do pierwszej części (przegrywania) to "coś" (czyli bot gracza) mógłby zablokować przejazd bota i wtedy mamy problem. Chociaż... gdyby dać Shootera to mógłby się bronić :D (strzelać do blokującego go bota). Tylko oczywiście wtedy można osłaniaczem itp. itd. Ale osłaniacz nie wjedzie pod wodę i tu mamy rozwiązanie :) .
ALE i tak jest problem bo gracz może zatrudnić brygadę nurków i wtedy jak jednemu nurkowi kończy się osłona to jedzie do warsztatu (lub osłaniacza), podjeżdża drugi itp.
Także idealne rozwiązanie jest możliwe tylko wtedy gdy nie można wybudować nurka lub nie można wybudować osłaniacza i warsztatu. W misjach gdzie nie robimy zadań "podwodnych" można spokojnie wyłączyć budowanie nurka i sprawa załatwiona.

COLOBOT - 16-09-2008, 09:54
Temat postu: RE: Dodajcie do fabuły misję na czas.
Tylko po co się zastanawiać jak zrobić, żeby gracz nie stosował sztuczek. Jak jest upierdliwy i chce, to zrobi jakiś przekręt. W oryginalnej fabule można wyjechać działem fazowym bez otwierania skrytki i nie jest to aż tak wielki błąd, tylko jeden z bugów, który udało się wykryć.

BTW możnaby zrobić w rogu mapy głęboką kotlinę otoczoną wysokimi górami, których nijak nie da się pokonać i tam umieścić PracticeBota. Jak gracz jakimś cudem przejdzie przez tę przeszkodę, to niech już się cieszy.

adiblol - 19-09-2008, 10:40
Temat postu: RE: Dodajcie do fabuły misję na czas.
No tak ale wtedy ktoś może użyć "nolimit" :D . Ale jak może użyć "nolimit" to może też użyć "winmission"...

Wypowiadajcie się który pomysł lepszy: mój czy cyklopka11.

mrowek - 19-09-2008, 15:52
Temat postu: RE: Dodajcie do fabuły misję na czas.
twój bo ciekawszy

cyber_J - 28-11-2008, 19:57
Temat postu: RE: Dodajcie do fabuły misję na czas.
też uważam, że twój, adiblol, ciekawszy pomysł


Piter - 04-12-2008, 17:50
Temat postu: RE: Dodajcie do fabuły misję na czas.
bardzo ciekawy
lukas_j - 18-12-2008, 18:51
Temat postu: RE: Dodajcie do fabuły misję na czas.
ja mam jedno zdanie: gracz oszuka to oszuka... kazdy moze wpisac winmisiion i koniec! Jak chche na kodach grac, ma do tego prawo... A co do takich zabezpieczen to uwazam ze mozna dac nie robota, ale np. mrowke, i ona musi wprodukowac np. tnt, jak go wyprodukuje misja konczy sie powodzeniem, lub niepowodzeniem, nie trzeba robic przechodzenia, ale gracz moze rozwalic mrowke wiec jesli rozwali mrowke = przegranie misji, chyba ze zastosujemy robala, ktory wejdze pod ziemie, i bedzie czekal, jesli robal moze cos produkowac, to niech wyprodokuje np. tnt, nie musi sie ruszac, jak wyprodukuje to tnt = przegrana lub wygrana misja

co o tym sadzicie B)

Piter - 19-12-2008, 11:18
Temat postu: RE: Dodajcie do fabuły misję na czas.
no jasne
adiblol - 19-12-2008, 13:55
Temat postu: RE: Dodajcie do fabuły misję na czas.
Ale robal sam nie wie kiedy jest pod ziemią :(
Sprawdzałem parametr altitude ale on się nie zmienia :(

DemoLisH - 19-12-2008, 18:36
Temat postu: RE: Dodajcie do fabuły misję na czas.
a ja sprawdzilem position.z-topo(position)
i tez nic

adiblol - 19-12-2008, 19:18
Temat postu: RE: Dodajcie do fabuły misję na czas.
to trzeba eksperymentalnie dobrać instrukcję move() na początku działania skryptu.

Jest jeden problem: jeśli gracz zapisze i wczyta grę to z powrotem robal wyjdzie na powierzchnię (to jest bug).

[dodane]
Wpadłem na coś takiego: gdyby zbliżyło się działo to robal wyświetliłby "Uwaga: kontynuowanie oszukiwania spowoduje zawieszenie gry." i (jeśli to by nie pomogło) - produkowałby miny na całej planszy albo rozmnażałby pająki xD. Oprócz tego że szkodliwe dla gracza to dodatkowo taka nieprzerwana produkcja zawiesi grę i spowoduje ten komunikat: "Nie można tego zbudować, za dużo obiektów".

DeiDara - 29-01-2009, 16:53
Temat postu: RE: Dodajcie do fabuły misję na czas.
[dodane]
Wpadłem na coś takiego: gdyby zbliżyło się działo to robal wyświetliłby "Uwaga: kontynuowanie oszukiwania spowoduje zawieszenie gry." i (jeśli to by nie pomogło) - produkowałby miny na całej planszy albo rozmnażałby pająki xD. Oprócz tego że szkodliwe dla gracza to dodatkowo taka nieprzerwana produkcja zawiesi grę i spowoduje ten komunikat: "Nie można tego zbudować, za dużo obiektów".[/quote]

Bradzo pomysłowe brawa!!!;)


ej ja tego niepisałem!!!!

colobotwymiiata - 23-02-2009, 13:47

lol, ale mamy problemy ;-) ;-) ;-)
DOJO - 27-02-2009, 22:43

Z tymi mrówkami i robalami to wystarczy im w skrypcie usunąć cel PracticeBota i będzie git! W tedy tylko już gracz będzie mógł oszukiwać.
lukas_j - 28-02-2009, 12:48

e tam, oszukuje to oszukuje, kody sa po to, jak ktos chce niech uzywa. Ja uwazam tak: Dać np. te roboy, i wtedy jeden niszczy drugiego, i taki komunikat:

Uwaga! Zblizyles sie do stefy programowej misji! Mozesz tu byc, ale nic nie rob! Jesli cos zrobisz albo zniszczysz roboty, to misja skonczy sie niepowodzeniem, chyba tego nie chcesz?


I dac to tak zeby mrowki nie przeszly ;P robali dawac nie trzeba. A mozna dac mrowkom skrypt aby nie atakowaly practisebota i targetbota. Mozna zrobic tak, ze jeden wjedzie w drugiego. A co jesli gracz zablokuje? Dajemy errmode(0); I jakis skrypt. Jesli np. Nie ma wolnej drogi do targetbota, to wyswietli sie komunikat: "UWAGA! Jestes na strefie programowej gry! Mowilem zebys nic nie robil, ale nie posluchales! Misja konczy sie niepowodzeniem!" Albo dac czas, np: "Jesli za 10 sekund nie zjedziesz stad, misja skonczy sie niepowodzeniem" Tylko jak sterowac kodem programu? Mozna dac kilka rzeczy, np. Mine i targetbota, albo dookola niego 4 miny. jak jedna sie zniszczy to koniec, a gracz tego nie przepcha :P


Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group