From ddc8c5b4142b44c7ce804d88b9fee7ac8f1bcb10 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 29 Aug 2022 15:22:10 +0200 Subject: [PATCH] AI fine tune --- MANUAL_EN.md | 6 +++--- MANUAL_PL.md | 6 +++--- ai.asm | 8 +++++--- scorch.xex | Bin 50643 -> 50639 bytes 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/MANUAL_EN.md b/MANUAL_EN.md index 03c225f..ee6437c 100644 --- a/MANUAL_EN.md +++ b/MANUAL_EN.md @@ -204,13 +204,13 @@ The game has 8 difficulty levels of computer-controlled opponents. Or actually 7 * **Shooter** - This opponent does not shoot blindly. He chooses one direction for himself. Based on his own position - he shoots in the direction from which there is more space assuming that this is where the other tanks are. He starts firing from a high angle and shot after shot changes this angle to a lower and lower angle trying to fire the entire area on the chosen side. He always fires with the best weapon he has (the highest on the list of weapons he has - that is, not necessarily the best). He does not use defensive weapons even though he buys them! At the beginning of the round, he makes 1 attempt to buy defensive weapons (only from the **Battery** - **Strong Parachute** range) and 4 offensive weapons (from the **Missile** - **Heavy Roller** range). -* **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 2 attempts to buy defensive weapons and 7 offensive weapons. +* **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 1 attemp to buy defensive weapons and 6 offensive weapons. -** **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/2500) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons. +** **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons. ** **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless low energy is required (the target is close). Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**. -* **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/2500) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him. +* **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him. ** **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless low energy is required (the target is close). Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**. diff --git a/MANUAL_PL.md b/MANUAL_PL.md index 8d74e79..3bd3351 100644 --- a/MANUAL_PL.md +++ b/MANUAL_PL.md @@ -199,13 +199,13 @@ Gra posiada 8 poziomów trudności przeciwników sterowanych przez komputer. A w * **Shooter** - Ten przeciwnik nie strzela na oślep. Wybiera sobie jeden kierunek. Na podstawie własnej pozycji - strzela w stronę z której jest więcej przestrzeni zakładając, że to tam są inne czołgi. Ostrzeliwanie zaczyna od wysokiego kąta i strzał po strzale zmienia ten kąt na coraz niższy starając się ostrzelać cały obszar po wybranej stronie. Strzał oddaje zawsze najlepszą posiadaną bronią (najwyższą na liście posiadanych broni - czyli nie koniecznie najlepszą). Nie używa broni defensywnych mimo, że je kupuje! Na początku rundy podejmuje 1 próbę zakupu broni defensywnych (tylko z zakresu **Battery** - **Strong Parachute**) i 4 ofensywnych (z zakresu **Missile** - **Heavy Roller**). -* **Poolshark** - Atakując wyznacza sobie za cel najbliższy czołg, następnie dobiera kąt strzału, a jego siłę stara się dobrać losując ją z wybranego przedziału. Strzał oddaje zawsze najlepszą posiadaną bronią. Używa broni defensywnych. Z prawdopodobieństwem 1:3 aktywuje przed oddaniem strzału najlepszą posiadaną broń defensywną (najwyższą na liście posiadanych broni - czyli nie koniecznie najlepszą). Jeżeli poziom jego energii spadnie poniżej 30 jednostek - używa **Battery** (oczywiście jeśli wcześniej ją kupił), jeżeli energia spadniej poniżej 5 i nie ma **Battery** poddaje się - **White Flag**. Na początku rundy podejmuje 2 próby zakupu broni defensywnych i 7 ofensywnych. +* **Poolshark** - Atakując wyznacza sobie za cel najbliższy czołg, następnie dobiera kąt strzału, a jego siłę stara się dobrać losując ją z wybranego przedziału. Strzał oddaje zawsze najlepszą posiadaną bronią. Używa broni defensywnych. Z prawdopodobieństwem 1:3 aktywuje przed oddaniem strzału najlepszą posiadaną broń defensywną (najwyższą na liście posiadanych broni - czyli nie koniecznie najlepszą). Jeżeli poziom jego energii spadnie poniżej 30 jednostek - używa **Battery** (oczywiście jeśli wcześniej ją kupił), jeżeli energia spadniej poniżej 5 i nie ma **Battery** poddaje się - **White Flag**. Na początku rundy podejmuje 1 próbę zakupu broni defensywnych i 6 ofensywnych. -* **Tosser** - Atakując działa dokładnie tak jak **Poolshark** jednak może posiadać "lepszy" zasób broni dzięki innej taktyce zakupów. Zawsze przed strzałem aktywuje najlepszą posiadaną broń defensywną. i tak jak **Poolshark** stosuje **Battery** i **White Flag**. Na początku rundy ocenia ile ma pieniędzy i w zależności od tego podejmuje (pieniądze/2500) prób zakupu broni defensywnych a następnie jeszcze raz sprawdza ile pieniędzy mu zostało i podejmuje (pieniądze/1250) prób zakupu broni ofensywnych. +* **Tosser** - Atakując działa dokładnie tak jak **Poolshark** jednak może posiadać "lepszy" zasób broni dzięki innej taktyce zakupów. Zawsze przed strzałem aktywuje najlepszą posiadaną broń defensywną. i tak jak **Poolshark** stosuje **Battery** i **White Flag**. Na początku rundy ocenia ile ma pieniędzy i w zależności od tego podejmuje (pieniądze/5100) prób zakupu broni defensywnych a następnie jeszcze raz sprawdza ile pieniędzy mu zostało i podejmuje (pieniądze/1250) prób zakupu broni ofensywnych. * **Chooser** - Obiera sobie za cel najsłabszego przeciwnika (o najmniejszym zasobie energii) i celuje bardzo dokładnie, jednak przed samym strzałem energia strzału modyfikowana jest o parametr szczęścia :) , czyli mimo precyzyjnego wycelowania nie zawsze trafia. Strzał oddaje najlepszą posiadaną bronią chyba że wymagana jest małą energia (cel jest blisko). Wtedy zmienia broń na **Baby Missile** by unikać trafienia samego siebie. Zawsze przed strzałem aktywuje najlepszą posiadaną broń defensywną i tak jak **Poolshark** stosuje **Battery** i **White Flag**. Zakupów dokonuje tak samo jak **Tosser**. -* **Spoiler** - Strzela dokładnie tak jak **Chooser** tyle, że ma więcej szczęścia :) , co oznacza że nawet jeśli nie trafi w wybrany cel, to może być to strzał precyzyjniejszy niż **Chooser**. Broni defensywnych używa dokładnie tak jak **Chooser**. Na początku rundy ocenia ile ma pieniędzy i w zależności od tego podejmuje (pieniądze/2500) prób zakupu broni defensywnych a następnie jeszcze raz sprawdza ile pieniędzy mu zostało i podejmuje (pieniądze/320) prób zakupu broni ofensywnych. Przy zakupie broni defensywnych kupuje tylko bronie silne i precyzyjne - czyli takie, które nie zrobią mu przypadkiem krzywdy. +* **Spoiler** - Strzela dokładnie tak jak **Chooser** tyle, że ma więcej szczęścia :) , co oznacza że nawet jeśli nie trafi w wybrany cel, to może być to strzał precyzyjniejszy niż **Chooser**. Broni defensywnych używa dokładnie tak jak **Chooser**. Na początku rundy ocenia ile ma pieniędzy i w zależności od tego podejmuje (pieniądze/5100) prób zakupu broni defensywnych a następnie jeszcze raz sprawdza ile pieniędzy mu zostało i podejmuje (pieniądze/320) prób zakupu broni ofensywnych. Przy zakupie broni defensywnych kupuje tylko bronie silne i precyzyjne - czyli takie, które nie zrobią mu przypadkiem krzywdy. * **Cyborg** - Obiera sobie za cel najsłabszego przeciwnika (o najmniejszym zasobie energii) lecz preferuje przeciwników sterowanych przez człowieka. Celuje bardzo dokładnie i w zdecydowanej większości przypadków trafia za pierwszym strzałem. Strzał oddaje najlepszą posiadaną bronią chyba że wymagana jest małą energia (cel jest blisko). Wtedy zmienia broń na **Baby Missile** by unikać trafienia samego siebie. Broni defensywnych używa dokładnie tak jak **Chooser**. Zakupy robi dokładnie tak jak **Spoiler** diff --git a/ai.asm b/ai.asm index 49c2a71..ab9e339 100644 --- a/ai.asm +++ b/ai.asm @@ -977,16 +977,16 @@ SorryNoPurchase ;---------------------------------------------- .proc PoolsharkPurchase ; first try to buy defensives - mva #2 tempXroller; number of offensive purchases to perform +; mva #2 tempXroller; number of offensive purchases to perform ldx TankNr @ randomize ind_Battery________ ind_Bouncy_Castle__ jsr TryToPurchaseOnePiece dec tempXroller - bne @- +; bpl @- ; and now offensives - mva #7 tempXroller; number of purchases to perform + mva #6 tempXroller; number of purchases to perform ;ldx TankNr @ randomize ind_Missile________ ind_Dirt_Charge____ @@ -1002,6 +1002,7 @@ SorryNoPurchase ; what is my money level ldx TankNr lda MoneyH,x ; money / 256 + lsr ; /2 sta tempXroller ; perform this many purchase attempts ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform @@ -1029,6 +1030,7 @@ SorryNoPurchase ; what is my money level ldx TankNr lda MoneyH,x ; money / 256 + lsr ; /2 sta tempXroller ; perform this many purchase attempts ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform diff --git a/scorch.xex b/scorch.xex index 7c2f0027b1b22eff63df65096a7438f56af4ed03..9b7c9ef6709117a7430b8ef66dc4250ab4da856f 100644 GIT binary patch delta 10140 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 delta 10156 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 Zhd<-B>fhWkx#6hZI6}zYk?3pe@xNm@)tCSP