Enterprise Forever
:HUN => Konvertálás => BASIC programok átírása => Topic started by: szipucsu on 2021.January.03. 21:14:11
-
Mostanában írtak egy másik basic programot is TVC-re, Escape a címe. Fut Geco szoftveres TVC emulátorán. A menüben benne van az irányítás:
[attach=1]
[attach=2]
Gondolkodtam, hogy át lehetne írni EP-re, a program listája alapján szinte át se kell írni. Van benne néhány poke, a 2896-os címre ír értékeket, ezzel azt lehet állítani, hogy az egymásra printelt karakterek felülírják egymást, vagy átlátsszon a később printelt karakter. EP-n a grafikus módokban alapból egymásra rakja a karaktereket, attribútum módban felülírja. (Tényleg, azt el lehet érni attribútum módban valahogy, hogy egymásra kerüljenek a karakterek? Vagyis ne törölje le ott az előző karaktert, ahol 0 a karakter pixelének az értéke?) Ha törölni akarjuk, tintaszínnel kell felülírni előbb, szóval ez nem lenne probléma.
Még a TVC-hez hasonló, 32 karakter széles videolapot kell megnyitni a játék átírásakor a 42 helyett, de ez is ujjgyakorlat. Így elsőre más átírni valót nem láttam, az egy sorba zsúfolt utasítások szétszedésén kívül.
Utána lehet extrásítani a hangot és a grafikát, pl. soronként változó palettával, gyűrűmodulációs színekkel.
Érdekes fogást használ arra a program, hogy egy karakteren belül több szín legyen. Ugyanabba a pozícióba printel egymásra két karaktert, de a második printelése előtt megváltoztatja a színt.
A program átírásának hátránya az lehet, hogy a karakterek egy picit kisebbek lesznek, mivel az EP-s karakterek egy pixellel alacsonyabbak. Nem tudom, hogyan lehet megcsinálni, hogy EP-n az összes karakter egy pixellel magasabb legyen. Valahogy tuti meg lehet, hiszen a szoftveres emulátorban is ilyen. Ha ez is meglenne, akkor a színeket leszámítva (bias) tökéletesen lehetne szinte emulálni a TVC-s 4 színű módot, hiszen a 32 karakter széles TVC-s videolapot előállítani gyerekjáték.
Geco, azt mennyire lenne bonyolult megcsinálni, hogy basic program is kirajzolja a képernyő aljára a már jól ismert ENTERPRISE feliratot a szép színes vonalakkal? Gondolom, jó sok PLOT kellene hozzá egy 16 színű videólapra.
-
basicben nem lehet 10 pixel magas karaktereket elerni, mert a karakterkeszlet merete az ff szegmensen 9x8-as meretre van szabva, ha ez nem lenne,akkor is meg kene kuzdeni az EXOS LPT frissitesevel.
Az ENTERPRISE feliratot ugy tudnad legegyszerubben megcsinalni, hogy a 26. sorra nyitsz egy karakteres modot, 10 nem hasznalt karaktert atdefinialsz, es kiprinteled, a 27 sorra meg egy 16 szinu grafikus modot, es megrajzolod a vonalakat.
-
Na, ez azért durva TVC-n:
930 IF EL=1 THEN PRINT#0,AT EX,EY:MONSTER$:IF MOVE=1 THEN IF MAP(EX,EY)<>0 THEN EL=0:GOSUB3100:IF ENEMYLIVE(MAP(EX,EY))=1 THEN ENEMYLIVE(MAP(EX,EY))=0:GOSUB3120
A sorban a következő IF-et akkor nézi meg, ha az előző IF feltétele teljesült. EP-n valami ilyesmi lenne, de az END IF-ek hova kerülnek? Jól tippelem, hogy a végére? Már nem tudom követni:
930 IF EL=1 THEN
931 PRINT #10,AT EX,EY:MONSTER$
932 IF MOVE=1 THEN
933 IF MAP(EX,EY)<>0 THEN
934 EL=0:GOSUB 3100
935 IF ENEMYLIVE(MAP(EX,EY))=1 THEN ENEMYLIVE(MAP(EX,EY))=0:GOSUB 3120
936 END IF
937 END IF
938 END IF
-
TVC-n nem tudom, de EP-n kipróbáltam: ha egy feltétel teljesül, akkor a kettőspont utáni parancsokat is végrehajtja, mintha az IF THEN - END IF szerkezeten belül lennének. Ha TVC-n is így van, márpedig rokon a két Basic, akkor jó a kódod, és az END IF-ek is jó helyen vannak.
Ezzel a sorral próbáltam ki, az "a"-t és "b"-t is kiírta:
10 IF 1=1 THEN PRINT "a":PRINT "b"
-
Megcsináltam EP-re a TVC-s Escape játékot, és teleraktam EP-s extrákkal, amennyire tudtam. Ez mondjuk elég sokáig tartott, mert Geco 2 nap alatt írta át az Atic Atacot, és TVC-re is pár nap alatt írták át Spectrumról az International Karatét. Ez meg nekem majdnem két hét volt. Egyébként maga a játék nagyon jó, egy kicsit logikázni kell benne. Amíg kék a keret, addig nem lehet lépni még. Zzzippel lefordítottam, így várakozni se nagyon kell.
[attach=1]
[attach=2]
Ehhez kellett két envelope az escape szekvenciából. (A Zzzip nem szereti a törteket, envelope numbernél pedig törtet akartam megadni, így csak az escape szekvenciás módszer maradt, vagy a külön fájlból betöltése az envelope-nek, de ezt nem akartam.)
Elvileg ha 100-nál több ellenfél van a képernyőn, akkor leáll hibaüzenettel, de nem tudom, addig el lehet-e jutni. (Szerk: Most a 29. szintig jutottam el, ott 87 ellenfél volt.) A tömb mérete szerint kb. 768 ellenfél lehet, viszont a tömb összes elemének kezdeti értéknek 0-át kell adni, amit TVC-n meg lehet úszni, EP-n viszont sokat kell emiatt várakozni, így csak 100 elemnek adtam értéket a játék indulásakor.
Itt van egy régebbi változat, ami azért tetszik, mert valamit elszúrtam benne, de pont ezért lett kicsit más a szemük az ellenfeleknek, és néha piros lesz az egész ellenfél, ami elég jól áll nekik. Viszont itt nincs soronként változó paletta meg ilyenek, és a pálya utáni elszámolás is grafikus képernyőn történik még, így nem írják felül egymást az egymásra írt számok, ezt később attribútum képernyőre tettem.
[attach=3]
[attach=4]
-
Le kéne kérdezni a gép nyelvét, hogy az Y az Y legyen vagy Z :oops:
-
Lehetséges javaslatok?
230 RESTORE 3060
240 READ T1$,T2$,T3$,T4$,T5$
3060 DATA "**** **** **** **** *** ****"
3070 DATA "* * * * * * * * "
3080 DATA "**** **** * **** **** ****"
3090 DATA "**** **** * **** **** ****"
3100 DATA "**** **** **** * * * ****"
236 byte helyett 215 byte
230 LET T1$= "**** **** **** **** *** ****"
231 LET T2$= "* * * * * * * * "
232 LET T3$= "**** **** * **** **** ****"
233 LET T4$= "**** **** * **** **** ****"
234 LET T5$= "**** **** **** * * * ****"
310 DATA 63,63,63,199,199,199,7,7,7,248,248,248,56,56,192,192
a
260 RESTORE 310
sor helyére
340 sorig csak egyszer fút le.
-
Le kéne kérdezni a gép nyelvét
Azt hogyan lehet frappánsan? A WHEN... EXT "HELP BRD"... HANDLER kezdőknek való megoldás. :D Van valami rendszerváltozó, vagy valami, amiből könnyen kiolvasható?
Lehetséges javaslatok?
Persze, ezeket meg is csinálhatom majd a gép nyelvének lekérdezésével együtt. Az eredeti TVC programban volt így, én meg annak a szerkezetén nem igazán változtattam. Jöhetnek további javaslatok, ha vannak.
-
További:
5000 DEF VIDEOINI
5010 SET VIDEO X 32:SET VIDEO Y 1:SET VIDEO MODE 15
5020 OPEN #1:"video:"
5030 OPEN #2:"video:"
5040 SET #1:PALETTE 32,254,111:SET #2:PALETTE 96,182,109
5050 RESTORE 5110
5060 FOR I=33 TO 54
5070 OPEN #I:"video:"
5080 READ J,K
5090 SET #I:PALETTE J,K,217,123
5100 NEXT
5110 DATA 32,1,32,1
5120 DATA 176,211,176,1
5130 DATA 48,186,48,1
5140 DATA 160,1,160,1,32,1
5150 DATA 104,221
5160 DATA 104,1,40,1
5170 DATA 40,1,64,1
5180 DATA 148,190
5190 DATA 148,1,20,1,20,1
5200 DATA 84,1,28,2
5210 DATA 84,1,0,1
5220 SET VIDEO MODE 1:SET VIDEO COLOR 1
5230 FOR I=3 TO 24
5240 OPEN #I:"video:"
5250 NEXT I
5260 END DEF
A DATA sorokat vagy a DEF-en kívül vagy a 5041-5059 sorba áthelyezni
Milyen "video:" a játék mező ATTRIBUTOM ?
-
Milyen "video:" a játék mező ATTRIBUTOM ?
4 színű grafikus képernyő a játékképernyő. A menü képernyője is ugyanaz. Pontosabban soronként külön-külön videolap.
Amikor a szintek után "végelszámolás" van, az attribútum képernyő, ez van a DATA sorokban, amit idéztél. (DEF PALGAME - a játékmező palettája; DEF PALMENU - a menü palettája; a szintek közötti elszámolós képernyő palettája meg a VIDEOINI-ben van.)
Ez azért van így, mert a krampuszok szemének a villódzását úgy oldják meg (meg a lövést is), hogy nem írja felül egyik karakter a másikat, hanem ráír. Ezt csak grafikus módban lehetett EP-n megcsinálni, attribútum képernyőn nem. (Vagy ha meg is lehetett volna, az biztos jó bonyolult lehet, amiről lövésem sincs.)
-
Azt hogyan lehet frappánsan? A WHEN... EXT "HELP BRD"... HANDLER kezdőknek való megoldás. :D Van valami rendszerváltozó, vagy valami, amiből könnyen kiolvasható?
144-es EXOS változó, de azt is WHEN blokkba kell rakni :-)
Ha nem létezik a változó, akkor angol.
Ha létezik, és értéke 0, akkor német, egyébként angol.
-
144-es EXOS változó
Köszi! Még az jutott eszembe, hogy megnézni ott, ahol a hibaüzenetek tárolódnak, hogy mi van. Pl. a Not understood / Nicht verstanden második betűjén megnézni, milyen bájt van. Ha "o", akkor angol, ha "i", akkor német. Vagy ez nem ilyen egyszerű? (Spanyol vagy magyar nyelvű gépnél megint más van ott, az biztos érdekes.)
-
Ferro73 apró javaslatait megcsináltam, és most már elméletileg jó az irányítás is a Z és Y billentyűkkel angol és német gépen:
[attach=1]
[attach=2]
Én régen alapból úgy állítottam be az emulátort, hogy megcseréltem magamnak az y és z betűket, mert úgy kényelmesebb. Most aztán jól megjártam, mert most meg nekem nem jó sehogy sem a jó beállításokkal a játék. Ha minden igaz, de már teljesen belezavarodtam. Leellenőriztem uk és brd konfiggal is, elméletileg működik (nekem fordítva), de azért nézzétek meg, nálatok jól működik-e.
UI.: Közben eszembe jutott, az emulátorban is lehet betölteni/kimenteni keyboard configot az Options - Keyboard map menüpontban. Így visszaállítható az elállítgatás. A Clear All minden gomb működését törli, ez még nem tudom, miért lehet jó.
-
Jópofa kis játék, és jók lettek az extrák, pláne a press space-nél a hang.
-
Nem lassú kicsit, pl. a játék indításakor? Vagy belefér? Igaz, nem is tudom, hogyan lehetne még gyorsítani.
Elég, ha 100 ellenség a maximum? A 30-as szint fölé nem tudom, el lehet-e jutni. Tényleg ciki lenne, ha az izgalmas játék 100 ellenség fölött hibával leállna. :D
-
Javaslat:
5440 DEF PALGAME !LET C0=0:LET C1=10:LET C2=91:LET C3=41
5450 RESTORE 5500
5460 FOR I=3 TO 24
5470 READ J0,J1,J3
5480 SET #I:PALETTE J0,J1,C2,J3
5490 NEXT I
5500 DATA 0,130,121
5510 DATA 64,130,233
5520 DATA 8,130,105
5530 DATA 72,18,41
5540 DATA 8,18,97
5550 DATA 64,18,41
5560 DATA 0,146,105
5570 DATA 32,146,233
5580 DATA 96,146,121
5590 DATA 40,146,233
5600 DATA 104,146,105
5610 DATA 40,210,41
5620 DATA 96,210,97
5630 DATA 32,210,41
5640 DATA 0,210,105
5650 DATA 64,154,233
5660 DATA 8,154,121
5670 DATA 72,154,233
5680 DATA 8,154,105
5690 DATA 64,218,41
5700 DATA 0,218,97
5710 DATA 32,218,33
5720 END DEF
helyette:
5440 DEF PALGAME !LET C0=0:LET C1=10:LET C2=91:LET C3=41
5450 RESTORE 5500
5460 FOR I=3 TO 24
5470 READ J0,J1,J3
5480 SET #I:PALETTE J0,J1,C2,J3
5490 NEXT I
5495 END DEF
5500 DATA 0,130,121
5510 DATA 64,130,233
5520 DATA 8,130,105
5530 DATA 72,18,41
5540 DATA 8,18,97
5550 DATA 64,18,41
5560 DATA 0,146,105
5570 DATA 32,146,233
5580 DATA 96,146,121
5590 DATA 40,146,233
5600 DATA 104,146,105
5610 DATA 40,210,41
5620 DATA 96,210,97
5630 DATA 32,210,41
5640 DATA 0,210,105
5650 DATA 64,154,233
5660 DATA 8,154,121
5670 DATA 72,154,233
5680 DATA 8,154,105
5690 DATA 64,218,41
5700 DATA 0,218,97
5710 DATA 32,218,33
5720 REM
Rengeteg felesleges memóriát használ fel és felesleges idő pocsékolás.
-
Javaslat:
Ennek tényleg lehet jelentősége, hogy a DATA sorok a DEF-en belül vannak-e vagy nem? Tudom, hogy külön a program végére illene tenni az összes DATA sort. Csak azért teszem oda, ahol a READ is van hozzá, mert úgy át tudom látni, mihez mi tartozik.
-
Ennek tényleg lehet jelentősége, hogy a DATA sorok a DEF-en belül vannak-e vagy nem?
Mivel a Basic egy interpreter, időbe telik, amíg a DATA sorokat végigcsámcsogja a szubrutin végén és nem csinál velük semmit. Le lehetne tesztelni, mennyivel fut gyorsabban, ha nem a rutinon belül vannak. Zzzipnél lehet, hogy mindegy.
-
Mivel a Basic egy interpreter, időbe telik, amíg a DATA sorokat végigcsámcsogja a szubrutin végén és nem csinál velük semmit. Le lehetne tesztelni, mennyivel fut gyorsabban, ha nem a rutinon belül vannak. Zzzipnél lehet, hogy mindegy.
Leteszteltem BASIC-ban gyorsabb.
Nem kell 2x átrágnia a DATA sorokat
Ennek tényleg lehet jelentősége, hogy a DATA sorok a DEF-en belül vannak-e vagy nem? Tudom, hogy külön a program végére illene tenni az összes DATA sort. Csak azért teszem oda, ahol a READ is van hozzá, mert úgy át tudom látni, mihez mi tartozik.
Az nem gond ha belül van. Az már igen ha 2x is betöltöd.
Először a RESTORE beállítja a READ DATA-it ez ok.
Majd megint a DATA sor előre beolvassa a memóriába amit később kiolvashatsz READ-al. Mind addig amig nem jön egy RESTORE mer akkor törli ami a memóriában van.
Új variáció, Így szintén jó.
xxx1 RESTORE
xxx2 DATA 1,2,3,4
xxx3 READ A,B,C,D
Javaslat:
A
3880 GOSUB 4840
Mivel ez az egyetelen hivatkozás ezért a
4840 FOR K=1 TO 10
4850 IF (K BAND 1)=0 THEN
4860 SET #EX:INK 3
4870 ELSE
4880 SET #EX:INK 2
4890 END IF
4900 PRINT #EX,AT 1,EY:DEAD$;
4910 SOUND PITCH K+32,DURATION 1,LEFT 96,RIGHT 96
4920 SOUND SOURCE 1,STYLE 48,DURATION 3,INTERRUPT,PITCH 42+K*3,RIGHT 8*EY-1,LEFT 255-(8*EY-2)
4930 FOR PPP=1 TO 120
4940 NEXT PPP
4950 NEXT K
4960 SET #EX:INK 0:PRINT #EX,AT 1,EY:CHR$(159);:SET #EX:INK 2
4970 FOR PPP=1 TO 600
4980 NEXT PPP
15 sort 3871-3889 közé bezsufolhatod.
-
Az nem gond ha belül van. Az már igen ha 2x is betöltöd.
Szerintem az is lassít, ha csak ott vannak a DATA sorok és nem olvassa be kétszer. REM sorok is lassítanák, amíg elérne az END DEF-ig. Egy compiler fordításkor észrevenné, de az interpreter futási időben foglalkozik ezekkel a sorokkal.
-
Szerintem az is lassít, ha csak ott vannak a DATA sorok és nem olvassa be kétszer.
Lepróbáltam ha csak 1x fút a DATA sor(ok) akkor nincs jelentősége, hogy kint vagy bent.
-
A TVC-ról átírt Escape játékban javítottam pár dolgot. A szörnyek szemének villogásakor egy pixellel lejjebb volt a piros szem, mint kellett volna. A teleportáláskor a hang nem annyira volt jó. Volt egy felesleges értékadó ciklus a program elején, amiről azt hittem, kell, de nem kell, azt töröltem. A szörnyek mozgásakor és a bonus elszámolásakor az egyre magasabb hangok elméletileg előbb-utóbb hibát okoznak a sokadik szinten, mert túl nagy lesz az érték, ezt is javítottam (ehhez kellett volna a MIN függvény, de a Zzzip nem csípte). A kijelző második sorának színét is elméletileg megváltoztattam, de már nem tudom, milyen volt az előző.
[attach=1]
Majd csinálok egy végtelen lőszeres verziót, azzal lehet tesztelni, hogy viszi a sokadik szinteket.
-
Az előző nem volt még tökéletes, ez már remélhetőleg az. A pálya elején nem váltott kékre a keret arra az időre, amíg még nem léphettünk, most már átvált. Talán még valami apróságokat is ügyködtem rajta, de már nem tudom, mit. :D
Végtelen lőszerrel a 40. szinten is ment, de már negatív lett a pontszám, mert túllépte a Zzzip által megengedett értéket. De csalás nélkül a 30. szintre is csoda, ha eljut az ember. Ha 10 lőszerünk van és 10000 nagyságrendű a pontszám, akkor a score felirat S betűjét felülírja a lőszer száma. De ez csak elméleti probléma, ha el is ér valaki ekkora eredményt, biztos nem lesz már 10 lőszer csalás nélkül.
Végtelen lőszeres verziót nem teszek fel, könnyen előállíthatja, aki akarja. :D
Nagyon fontos mellékes kiegészítés, hogy minden gomb megnyomására (az irányítógombok kivételével) más hangot ad a játék, shift-tel együtt nyomva még érdekesebb. A funkcióbillentyűk hatása is fenomenális. Így szintetizátorként is használható, ha a játék esetleg unalmassá válna. (Még jó, hogy a SOUND PITCH ORD(A$) is működik, amikor A$=INKEY$.)
Az ESC-vel vissza lehet lépni a menübe.