Versione Stampabile della Discussione

Clicca qui per visualizzare questa discussione nel suo formato originale

OldGamesItalia _ Traduzioni in corso _ Traduzione e ampliamento di "MANOR" in BASIC (MANIERO)

Inviato da: TheRuleril 10 Aug 2018, 17:11

******************
https://www.oldgamesitalia.net/traduzioni/maniero-ii-gwbasic
******************



Salve ragazzi, ho finalmente messo le mani su quasto mio vecchio progetto nel cassetto ed ho cominciato a tradurlo.
Procedendo col codice ho trovato utile inserire alcune cose per rendere più piacevole l'esperienza come stringhe colorate in base al tipo di informazione data dal gioco (ad esempio, Le descrizioni in verde, i suggerimenti del consigliere in giallo, le statistiche in bianco ecc...) inoltre ho introdotto il tempo trascorso, per avere al termine di gioco la statistica degli anni passati che non guasta.
Ad ogni pagina ho indicato i valori delle cose che servono maggiormente per prendere decisioni (acri di terra, moggi di grano e fiorini) e ad ogni anno un riepilogativo più completo.


Avendo aggiunto quello che ho in magazzino ogni volta mi sono accorto di un bug. Il calcolo delle tasse era sbagliato e sto cercando di risolverlo ma ho un piccolo problema con una routine che mi sta facendo uscire pazzo.



questa è la porzione incriminata:
CODICE
1270 GOSUB 2770:TP=RND*.5+.1:CLS:PRINT:COLOR 7,0:PRINT "Disponi di"LE"acri nel tuo latifondo,"G"moggi di grano e"P"Fiorini.":PRINT:COLOR 6,0:PRINT "Lo sceriffo del Re e' arrivato al tuo maniero per la riscossione.":PRINT
1280 KT=1:IF G+P*5>800 THEN KT=KT+(G+P*5-800)/500:IF KT=>2 THEN PRINT "Le tasse sono alte quest'anno, mio Signore.":PRINT
1290 PRINT "Tasse gravanti sul tuo maniero:":TL=ABS(INT(LE*.15*TP*KT/5)):TL1=ABS(INT(LE*.15-TL*5+.5)):PRINT " Tasse per la tua terra:",TL"fiorini,"TL1"moggi di grano"
1300 TH=HE1*.15*KT:TH1=ABS(INT(TH*TP/5+.5)):PRINT " Tasse per il tuo raccolto:",TH1"fiorini,"ABS(INT(TH-TH1*5))"moggi di grano"
1310 GOSUB 2770:MT=INT(RND*40+KT/2+PTF/2):MT1=INT(MT*TP/5):PRINT " Tasse varie ed eventuali:",MT1"fiorini,"INT(MT-MT1*5)"moggi di grano"
1320 TTL=INT(TL+TH1+TI1):TTT=INT(TL1+(TH-TH1*5)+(TI-TI1*10)+.5):PRINT " Totale tasse:",TTL+MT1"fiorini,"TTT+INT(MT-MT1*5)"moggi di grano.":P=P-TTL:G=G-TTT
1330 IF MT>0 THEN CT=0:PRINT:COLOR 14,0:PRINT "Signore, desidera occultare i"MT1"fiorini e i"MT-MT1*5"moggi":INPUT "riservati per le Varie ed eventuali (s/n)";X$:IF LEFT$(X$,1)<>"N" AND LEFT$(X$,1)<>"n" THEN GOTO 1350 ELSE GOTO 1340
1340 P=P-MT1:G=G-MT-MT1*5:CT=MT:PRINT:COLOR 2,0:PRINT "Lo sceriffo non riscontra alcuna anomalia e prende commiato."
1350 IF CT>1 THEN 1370 ELSE GOSUB 2770:IF RND*1>.65 THEN PRINT:PRINT "Lo Sceriffo non ci ha scoperto, sua Eccellenza!":PRINT:PRINT:GOTO 1370
1360 GOSUB 2770:PTF=INT(RND*CT+1)*2:COLOR 6,0:PRINT " Lo sceriffo durante l'ispezione trova"PTF/2"moggi occultati.":PRINT " La lealta' verso il tuo Re vacilla, tasse raddoppiate per l'anno prossimo.":PRINT:PRINT:PFF=PFF+PTF/2
1370 IF P<0 THEN G=G+P*6:COLOR 6,0:PRINT " Hai dovuto pagare"INT(-P*5.9+.5)"moggi di grano":PRINT " non avendo i"INT(-P+.5)"fiorini, al cambio in perdita.":PRINT:P=0:GOTO 1390
1380 IF G<0 THEN P=P+G/4:COLOR 6,0:PRINT " Hai dovuto pagare"INT(-G/4.1+.5)"fiorini":PRINT " non avendo i"INT(-G+.5)"moggi, al cambio in perdita.":PRINT:G=0
1390 IF G>0 THEN COLOR 2,0:PRINT "Sono presenti"G"moggi di grano nei tuoi magazzini.":IF P>0 THEN PRINT "Disponi di"P"fiorini nella tua tesoreria."
1400 IF G<1 AND P>0 THEN COLOR 6,0:PRINT "Nella tesoreria sono presenti solamente"INT(P)"fiorini, Sua Eccellenza."
1410 IF G<1 AND P<1 THEN COLOR 14,0:PRINT "Siamo in debito con il Re, Sua Eccellenza!"


e questo l'output:
CODICE
Disponi di 75 acri nel tuo latifondo, 936 moggi di grano e 22 Fiorini.          
                                                                                
Lo sceriffo del Re e' arrivato al tuo maniero per la riscossione.              
                                                                                
Tasse gravanti sul tuo maniero:                                                
Tasse per la tua terra:     0 fiorini, 11 moggi di grano                      
Tasse per il tuo raccolto:  4 fiorini, 96 moggi di grano                      
Tasse varie ed eventuali:   0 fiorini, 24 moggi di grano                      
Totale tasse:               4 fiorini, 132 moggi di grano.                    
                                                                                
Signore, desidera occultare i 0 fiorini e i 24 moggi                            
riservati per le Varie ed eventuali (s/n)? n                                    
                                                                                
Lo sceriffo non riscontra alcuna anomalia e prende commiato.                    
Sono presenti 804 moggi di grano nei tuoi magazzini.                            
Disponi di 18 fiorini nella tua tesoreria.                                      
                                                                                
Desidera dichiarare guerra a qualcuno (s/n)?


in pratica puoi decidere di nascondere allo sceriffo le "varie ed eventuali" che hai raccolto dal tuo popolo nell'anno.
Ma il calcolo va bene solo il primo anno, dal successivo aggiunge la multa che dovrebbe essere applicata solo quando fai il furbo. Come l'ho messa io CT>1 va bene ma quando scegli no e vieni beccato dallo sceriffo, egli trova sempre e solo 1 moggio, ma dovrebbe essere un numero casuale tra 1 e x. Con X dipendente dalla variabile MT.



questo il codice originale:
CODICE
1270 PRINT:CLS:GOSUB 2770:TP=RND*.5+.1:COLOR 6,0:PRINT:PRINT "The King's Sheriff has arrived at the manor.":PRINT
1280 KT=1:IF G+P*5>800 THEN KT=KT+(G+P*5-800)/500:IF KT=>2 THEN PRINT "Taxes are high this year, my lord.":PRINT
1290 PRINT "Taxes to your estates:":TL=ABS(INT(LE*.15*TP*KT/5)):TL1=ABS(INT(LE*.15-TL*5+.5)):PRINT " Tax on your land:",TL"pounds,"TL1"bushels of grain"
1300 TH=HE1*.15*KT:TH1=ABS(INT(TH*TP/5+.5)):PRINT " Tax on your harvest:",TH1"pounds,"ABS(INT(TH-TH1*5))"bushels of grain"
1310 GOSUB 2770:MT=INT(RND*40+KT/2+PTF/2):MT1=INT(MT*TP/5):PRINT " Miscellaneous:",MT1"pounds,"INT(MT-MT1*5)"bushels of grain"
1320 TTL=INT(TL+TH1+TI1):TTT=INT(TL1+(TH-TH1*5)+(TI-TI1*10)+.5):PRINT "  Total Taxes:",TTL+MT1"pounds,"TTT+INT(MT-MT1*5)"bushels of grain.":P=P-TTL:G=G-TTT
1330 IF MT>0 THEN CT=0:PRINT "Shall I cover up the"MT1"pounds and"MT-MT1*5"bushels":INPUT " in miscellaneous taxes";X$:IF LEFT$(X$,1)<>"N" AND LEFT$(X$,1)<>"n" THEN PRINT:GOTO 1350
1340 P=P-MT1:G=G-MT-MT1*5:CT=MT:PRINT
1350 IF CT<1 THEN 1370 ELSE GOSUB 2770:IF RND*1>.65 THEN PRINT " He didn't catch us, your excellency.":PRINT:PRINT:GOTO 1370
1360 GOSUB 2770:PTF=INT(RND*CT+1)*2:PRINT " He found"PTF/2"bushels missing.":PRINT:PRINT:PFF=PFF+PTF/2
1370 IF P<0 THEN G=G+P*6:PRINT "You've had to spend"INT(-P*5.9+.5)"bushels of grain":PRINT "in place of"INT(-P+.5)"pounds, at a loss.":PRINT:P=0:GOTO 1390
1380 IF G<0 THEN P=P+G/4:PRINT "You've had to spend"INT(-G/4.1+.5)"pounds sterling":PRINT "in place of"INT(-G+.5)"bushels, at a loss.":PRINT:G=0
1390 IF G>0 THEN PRINT "You have"G"bushels of grain in your storehouses":IF P>0 THEN PRINT " and"P"pounds sterling left in your treasury"
1400 IF G<1 AND P>0 THEN PRINT "We have only"INT(P)"pounds remaining, your excellency."
1410 IF G<1 AND P<1 THEN PRINT "We are in debt, your excellency!"


La riga 2770 è un generatore casuale

2770 RANDOMIZE(VAL(RIGHT$(TIME$,2))):RETURN

Oltre tutto c'è la questione del raddoppio delle tasse l'anno successivo se vieni beccato immagazzinata nella variabile PTF che modifica PFF, utile solo a fine partita.
CODICE
3560 CLS:PRINT"  THE KING'S TAXES"
3561 PRINT"The King's sheriff arrives in town and figures out your taxes."
3570 PRINT"They consist of a tax on your land, your harvest, your income"
3580 PRINT"(taxes to your population etc.), and on all miscellaneous"
3590 PRINT"factors.  You might be able to get away with covering up the"
3600 PRINT"miscellaneous tax, but if you are caught the king doubles it"
3610 PRINT"next year.  This also decreases his confidence in you as a"
3620 PRINT"loyal subject."


Qualcuno in grado di darmi una mano che mastichi BASIC e MATEMATICA? ;-)

 MANOR_ITA.txt ( 41.15k ) : 2
 MANOR_ORIGINAL.txt ( 29.2k ) : 4
 

Inviato da: Alpobempil 10 Aug 2018, 22:07

Ti ho seguito fino ad un certo punto , ma la faccenda della traduzione mi ha fuorviato.

Mi spiego.

Il medesimo - chiamiamolo bug - bug ce l'hai nella versione inglese originale o no?

Ciao,
Alberto

Inviato da: TheRuleril 10 Aug 2018, 22:18

Sì Alpo, è presente nella versione originale.
Per rendertene conto però devi aggiungere una stringa che ti faccia vedere nella stessa schermata lo stato delle tue finanze in modo da poter verificare.

Dove vuoi ma dopo CLS nella riga 1270

PRINT LE"acres,"G"Bushels,"P"Pounds."

Inviato da: DKil 11 Aug 2018, 12:23

Il problema è questo.

CODE
1350 IF CT>1 THEN 1370 ELSE GOSUB 2770:IF RND*1>.65 THEN PRINT:PRINT "Lo Sceriffo non ci ha scoperto, sua Eccellenza!":PRINT:PRINT:GOTO 1370
1360 GOSUB 2770:PTF=INT(RND*CT+1)*2:COLOR 6,0:PRINT " Lo sceriffo durante l'ispezione trova"PTF/2"moggi occultati.":PRINT " La lealta' verso il tuo Re vacilla, tasse raddoppiate per l'anno prossimo.":PRINT:PRINT:PFF=PFF+PTF/2
1370 IF P<0 THEN G=G+P*6:COLOR 6,0:PRINT " Hai dovuto pagare"INT(-P*5.9+.5)"moggi di grano":PRINT " non avendo i"INT(-P+.5)"fiorini, al cambio in perdita.":PRINT:P=0:GOTO 1390

Nella tua versione, se CT è maggiore di 1, va diretto alla riga 1370.
Altrimenti (quindi CT è minore o uguale ad 1) prosegue.

Ovvio che il numero più grande che si ritrova in questo punto sarà 1, per cui, se arrivi alla riga che lo sceriffo ti becca, il calcolo dei PTF sarà:
RND (numero a caso tra 0,1 e 1 se non ricordo male), quindi la probabilità che esca 1 è ridottissima
moltiplicato per CT (che se va bene è 1, oppure potrebbe essere 0,x) darà un numero intero 1 o 2 (raro)
moltiplicato per 2 darà 2 o 4 (raro)
quindi, nella successiva divisione per 2, al massimo avremo 1 o 2 come valori di moggi occultati (molto probabilmente quasi sempre 1).

Per cui, la condizione che c'è nel codice originale è corretta, se CT è maggiore o uguale ad 1 (quindi 1 o più) allora fa tutti quei calcoli e sicuramente possono uscire valori che vanno da almeno 1 in su come moggi occultati.
Però, se te dici che esce sempre uno, allora è il calcolo di CT (che poi è MT) che ha qualcosa che non va.

P.S. La riga 2770 è l'inizializzazione del generatore casuale, dandogli come base l'ora attuale (in realtà il secondo), in modo che poi il generatore (RND) dia valori abbastanza casuali.

Inviato da: TheRuleril 12 Aug 2018, 12:00

Grazie per averci guardato DK, ero arrivato alla stessa conclusione ma non capivo perché prima dei calcoli mettesse CT=0 e dopo CT=MT.
Perché CT è nel calcolo del PTF (la lealta' verso il Re) che IF MT>0 THEN CT=0 e così facendo l'anno successivo applica o meno il raddoppio delle tasse VARIE con PTF=INT(RND*CT+1)*2 PTF usato per calcolare solo le tasse VARIE non prima del giro (anno) successivo in 1310

1310 GOSUB 2770:MT=INT(RND*40+KT/2+PTF/2):MT1=INT(MT*TP/5):PRINT " Tasse varie ed eventuali:",MT1"fiorini,"INT(MT-MT1*5)"moggi di grano"
Ho fatto qualche modifica inserendo una seconda volta la stringa di dichiarazione
P=P-MT1:G=G-MT-MT1*5
perché in uno dei due casi veniva saltata e quindi non aggiornava il totale dei moggi in magazzino.

Ora aggiorna bene ma purtroppo ha una componente random che va da 0 a 30. Ho capito dov'è quella componente (serve per calcolare quante Tasse VArie pagare) ma non capisco perché venga inserita anche se decidi di NON ocultare e pagare tutto.


EDIT: Credo di aver risolto! Il problema stava nel fatto che per le Tasse Varie il programmatore avesse scelto di non dichiarare la quantità di moggi da pagare come una variabile ma con il calcolo INT(MT-MT1*5) ripetuto più volte anche nelle dichiarazioni delle costanti.
E' bastato dichiarare MT2 una volta e dare in pasto alle dichiarazioni sempre e solo MT2.

P=P-MT1:G=G-MT2

e una è fatta, ora la routine se decidi di occultare... ;-)

EDIT: fatto. Ora così dovrebbe funzionare tutto. Ho dovuto aggiungere due variabili per il controllo e l'applicazione della sovrattassa (OK e KT1)

Il PRINT "CT"CT"MT"MT"KT"KT"KT1"KT1"GG"GG"GG1"GG1"PTC"PTC"NTC"NTC"P3"P3"PTF"PTF"PFF"PFF"TH"TH"TH1"TH1"TL"TL"TL1"TL1"OK"OK
mi è servito per monitorare le variabili (in versione final, rimuoverò):

CODICE
1270 GOSUB 2770:TP=RND*.5+.1:CLS:PRINT:COLOR 7,0:PRINT "Disponi di"LE"acri nel tuo latifondo,"G"moggi di grano e"P"Fiorini.":PRINT:COLOR 6,0:PRINT "Lo sceriffo del Re e' arrivato nel tuo maniero per la riscossione.":PRINT
1280 KT=1:IF G+P*5>800 THEN KT=KT+(G+RA-GG-PTC-NTC+(P-GG1-P3)*5-500)/500:KT1=ABS(KT+(GG-RA+PTC+NTC+(GG1+P3)*5-500)/500):IF KT1=>2 THEN COLOR 14,0:PRINT "Le tasse saranno alte quest'anno, mio Signore.":COLOR 6,0:PRINT
1290 PRINT "Tasse gravanti sul tuo castello:":TL=ABS(INT(LE*.15*TP*KT/5)):TL1=ABS(INT(LE*.15-TL*5+.5)):PRINT " Tasse per la tua terra:",TL"fiorini,"TL1"moggi di grano"
1300 TH=HE1*.15*KT:TH1=ABS(INT(TH*TP/5+.5)):TH2=ABS(INT(TH-TH1*5)):PRINT " Tasse per il tuo raccolto:",TH1"fiorini,"TH2"moggi di grano"
1310 GOSUB 2770:MT=INT(RND*40+KT1+PTF/2):MT1=INT(MT*TP/5):MT2=ABS(INT(MT+PTF+MT1*5)):PRINT " Tasse per i tuoi guadagni:",MT1"fiorini,"MT2"moggi di grano"
1320 TTL=INT(TL+TH1+TI1):TTT=INT(TL1+TH2+(TI-TI1*10)+.5):PRINT " Totale tasse:",TTL+MT1"fiorini,"TTT+MT2"moggi di grano.":P=P-TTL:G=G-TTT
1330 OK=0:IF MT>0 THEN CT=0:COLOR 14,0:PRINT:PRINT "Signore, desidera occultare i"MT1"fiorini e i"MT2"moggi di grano":INPUT "delle tasse per i Suoi guadagni di quest'anno (s/n)";X$:IF LEFT$(X$,1)<>"S" AND LEFT$(X$,1)<>"s" THEN PRINT:GOTO 1350
1340 CT=MT:PRINT:PRINT "CT"CT"MT"MT"KT"KT"KT1"KT1"GG"GG"GG1"GG1"PTC"PTC"NTC"NTC"P3"P3"PTF"PTF"PFF"PFF"TH"TH"TH1"TH1"TL"TL"TL1"TL1"OK"OK
1350 OK=1:PTF=0:IF CT<1 THEN 1361 ELSE GOSUB 2770:IF RND*1>.65 THEN COLOR 14,0:PRINT "Lo Sceriffo non ci ha scoperto, sua Eccellenza!":PRINT:GOTO 1370
1360 GOSUB 2770:PTF=INT(RND*CT+1)*2:COLOR 6,0:PRINT " Lo sceriffo durante l'ispezione trova"PTF/2"moggi occultati.":OK=0:PFF=PFF+PTF/2:PRINT" La tua lealta' vacilla, come multa ti verranno raddoppiate le tasse l'anno      prossimo."
1361 P=P-MT1:G=G-MT2
1370 IF OK=1 THEN COLOR 6,0:PRINT " Lo sceriffo durante l'ispezione non riscontra alcuna anomalia, si congeda       congratulandosi per la tua lealta' e ti saluta all'anno prossimo."
1371 PRINT "CT"CT"MT"MT"KT"KT"KT1"KT1"GG"GG"GG1"GG1"PTC"PTC"NTC"NTC"P3"P3"PTF"PTF"PFF"PFF"TH"TH"TH1"TH1"TL"TL"TL1"TL1"OK"OK
1375 IF P<0 THEN G=G+P*6:COLOR 6,0:PRINT " Hai dovuto pagare"INT(-P*5.9+.5)"moggi di grano ad un tasso di cambio sconveniente,":PRINT " per coprire il debito di"INT(-P+.5)"fiorini che avevi col Re.":P=0:GOTO 1390
1380 IF G<0 THEN P=P+G/4:COLOR 6,0:PRINT " Hai dovuto pagare"INT(-G/4.1+.5)"fiorini ad un tasso di cambio sconveniente,":PRINT " per coprire il debito di"INT(-G+.5)"moggi di grano che avevi col Re.":G=0
1390 IF G>0 THEN COLOR 2,0:PRINT:PRINT "Sono presenti"G"moggi di grano nei tuoi magazzini.":IF P>0 THEN PRINT "Disponi di"P"fiorini nella tua tesoreria."
1400 IF G<1 AND P>0 THEN COLOR 14,0:PRINT:PRINT "Non abbiamo grano, disponiamo solo di"INT(P)"fiorini, Sua Eccellenza."
1410 IF G<1 AND P<1 THEN COLOR 14,0:PRINT:PRINT "Siamo in debito con il Re, Sua Eccellenza!":PRINT"Se non dovessimo ripagare il debito entro la prossima riscossione, Le ricordo,  che il Re ci applichera' gli interessi."

Inviato da: TheRuleril 18 Aug 2018, 10:10

Sul sito dell'autore è presente il file INTRO.BAS con le istruzioni, le ho aggiunte direttamente al gioco (adattandole alle modifiche che ho fatto):
Se vi andasse di dargli una letta e indicarmi errori o frasi poco chiare ve ne sarei grato. ;-)

3000 CLS:KEY OFF:COLOR 7,0:PRINT" *** MANIERO ***":PRINT:PRINT " Copyright © Leon Baradat 1986"
3010 PRINT:PRINT
3020 PRINT" Tu sei il conte Vorreimanonposso del medioevo italiano."
3030 PRINT" Il tuo maniero e' uno dei tanti nell'area ed e' circondato"
3040 PRINT" da cinque altri manieri guidati da nobili di vario potere "
3050 PRINT" in senso orario dal piu' debole (5) al piu' forte (1)."
3060 PRINT:PRINT" Cominci con 1385 acri di terra, 60 contadini, 75 servi,"
3070 PRINT" e 15 nobili, per una popolazione totale di 150."
3080 PRINT" 60 di loro sono in buona salute. Questa e' la tua forza"
3090 PRINT" di combattimento. Disponi inoltre di 15 fiorini e una"
3100 PRINT" piccola quantita' di grano rimasto dal raccolto dell'anno"
3110 PRINT" passato (150 moggi, l'unita' di misura corrente)."
3120 PRINT:PRINT" Una volta mostrate a schermo tutte queste informazioni"
3130 PRINT" il computer comincera' il corso degli eventi e delle deci-"
3140 PRINT" sioni che dovrai prendere durante l'anno:"
3150 PLAY "MB T100 O3 L16D L8D L8E L4F L4D L8D L8C L3D L8D L8D L8E L4F L4D L8D L8C L4D L8D L8G L8G L8A L4B L4G L8G L4F L8G L4G L16D L8D L8E L4F L4D L8D L8C L4D L8A L8D L8D L8E L4F L4D L8D L8C L2D"
3160 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 10
3170 CLS:PRINT:PRINT" TASSE"
3180 COLOR 7,0:PRINT:PRINT" Sei tu a decidere quanto tassare i tuoi contadini e nobili,"
3190 PRINT" ma non i tuoi servi, loro coltivano gia' la tua terra come"
3200 PRINT" forma di pagamento. Una tassa del 10% e' considerata giusta"
3210 PRINT" e 30% e' il limite massimo consigliato. A nessuno piace"
3220 PRINT" pagare le tasse e piu' alte sono piu' fame ci sara' in caso"
3230 PRINT" di una cattiva stagione del raccolto e di conseguenza meno"
3231 PRINT" probabilita' di nascite e piu' decessi."
3240 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3000
3250 CLS:PRINT:PRINT" TERRE DA COLTIVARE"
3260 COLOR 7,0:PRINT:PRINT" Dovrai decidere quanti acri del tuo latifondo personale far"
3270 PRINT" coltivare dai servi. Non puoi decidere quanto il tuo popolo"
3280 PRINT" debba coltivare delle proprie terre, lo faranno da soli."
3290 PRINT" Il grano raccolto nei tuoi acri, piu' le tasse, formano il"
3300 PRINT" volume del tuo reddito. Ricorda che una terra coltivata di"
3310 PRINT" continuo esaurira' la propria fertilita', e' dunque buona"
3320 PRINT" norma ruotare le colture. Lasciare incolta meta' delle tue"
3330 PRINT" terre ogni anno sara' sufficiente a mantenerle fertili."
3340 PRINT:PRINT" NOTA: Per coltivare la terra e' necessario spendere un mog-"
3350 PRINT" gio di grano per ogni acro. Dovrai dunque possedere"
3360 PRINT" il giusto ammontare prima della semina."
3370 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3170
3380 CLS:PRINT:PRINT" PROMOZIONE DEI CONTADINI"
3390 COLOR 7,0:PRINT:PRINT" Questo e' un modo per incrementare la forza militare del tuo"
3400 PRINT" maniero, promuovendo a nobili, dunque a cavalieri, i tuoi"
3410 PRINT" contadini in buona salute e assegnando loro 5 acri delle tue"
3420 PRINT" terre, 5 fiorini e 15 moggi di grano. Cio' riduce il numero"
3430 PRINT" di contadini in salute e puo' essere un modo costoso di"
3440 PRINT" rinforzare il tuo esercito. Ad ogni modo e' un metodo efficace"
3450 PRINT" e particolarmente utile in caso si voglia tentare di prendere"
3460 PRINT" la terra di un altro nobile con la forza o difendersi da un"
3470 PRINT" attacco."
3480 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3250
3490 CLS:PRINT:PRINT" COMPRAVENDITA TERRENI"
3500 COLOR 7,0:PRINT:PRINT" Occasionalmente un nobile vicino potrebbe voler desiderare di"
3510 PRINT" vendere parte della sua terra in modo da incrementare tempora-"
3520 PRINT" neamente le sue entrate, oppure voler semplicemente aumentare"
3530 PRINT" la superficie del suo maniero durante la stagione buona."
3540 PRINT" Questa non e' pratica comune visto che la terra, essendo la"
3550 PRINT" principale fonte per le entrate, e' molto costosa."
3560 PRINT" Prima di acquistare della terra ricorda che le tasse del Re"
3570 PRINT" arrivano verso meta' anno, e' dunque saggio tenere dei fiorini"
3580 PRINT" da parte, inoltre un'eventuale guerra puo' costare molto caro."
3581 PRINT:PRINT" La terra acquisita a seguito di guerre andra' a far parte dei"
3582 PRINT" tuoi possedimenti e quindi verra' tassata dal Re. Sara' dunque"
3583 PRINT" opportuno mostrarsi generosi verso il popolo ridistribuendo le"
3584 PRINT" terre prima dell'anno successivo per non incorrere in elevati"
3585 PRINT" balzelli."
3590 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3380
3600 CLS:PRINT:PRINT" DISTRIBUZIONE DELLE TERRE"
3610 COLOR 7,0:PRINT:PRINT" I tuoi servi ti presenteranno una mappa dell'area che hanno"
3620 PRINT" compilato per te. Ricorda che le mappe medievali erano grezze"
3630 PRINT" e raramente accurate e questa certo non fa eccezione."
3640 PRINT" Ne verra' mostrato un esempio piu' avanti."
3650 PRINT" La mappa mostra la distribuzione delle terre del tuo maniero"
3660 PRINT" Ad un certo punto potresti (o forse dovresti) aver bisogno di"
3670 PRINT" ridistribuire le terre. La quantita' tipica per ogni servo o"
3680 PRINT" contadino e' di 8.3 acri, 12.3 per ogni nobile e 75 per te"
3690 PRINT" stesso. Questa e' anche la distribuzione iniziale capace di"
3700 PRINT" garantire un giusto raccolto e una buona prosperita'."
3710 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3490
3720 CLS:PRINT:PRINT" LE TASSE DEL RE"
3730 COLOR 7,0:PRINT:PRINT" Lo sceriffo del Re arriva al tuo castello per calcolare le tue"
3740 PRINT" gabelle. Consistono in tasse sulla tua terra, il tuo raccolto,"
3750 PRINT" sui tuoi guadagni (tasse alla popolazione) e altri fattori."
3760 PRINT" Potresti provare a occultare i guadagni derivanti dalle tasse"
3770 PRINT" raccolte durante l'anno dal popolo e riuscire a farla franca"
3780 PRINT" nel caso l'ispezione rilevasse anomalie lo sceriffo, per volere"
3790 PRINT" del Re, sarebbe costretto a raddoppiare le tue tasse per l'anno"
3800 PRINT" successivo. Inoltre diminuirebbe la fiducia che il Re ripone in"
3810 PRINT" te come suddito leale."
3811 PRINT" Se non fossi in grado di pagare le tasse lo sceriffo ti propor-"
3812 PRINT" rebbe ad un tasso di cambio 'conveniente' di saldare con moggi"
3813 PRINT" o fiorini, a seconda del debito contratto. Offerta che potresti"
3814 PRINT" comunque rifiutare, decidendo di accollarti il debito in grano"
3815 PRINT" o denaro."
3816 PRINT" Nel caso tu non possieda ne' abbastanza fiorini ne' abbastanza"
3817 PRINT" moggi, il debito sara' subito applicato dallo sceriffo:"
3818 PRINT:PRINT" 1 fiorino ogni 4 moggi di grano mancanti"
3819 PRINT" 6 moggi di grano ogni fiorino mancante"
3820 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3600
3830 CLS:PRINT:PRINT" GUERRA!"
3840 COLOR 7,0:PRINT:PRINT" Un nobile puo' attaccarne un altro (normalmente un vicino piu'"
3850 PRINT" piccolo e debole) e rubare o perdere terre. Qualcuno potrebbe volerti"
3860 PRINT" attaccare, nel caso verresti allertato immediatamente. Puoi tentare"
3870 PRINT" di assoldare mercenari per accrescere la tua forza militare e potres-"
3880 PRINT" ti anche ritirarti nel tuo castello. Ad ogni modo i mercenari sono"
3890 PRINT" costosi e mediocri combattenti perche' non amano correre dei rischi."
3900 PRINT" Ritirarsi nel proprio castello aumenta le possibilita' di vittoria"
3910 PRINT" ma il bottino sara' minore se vinci. Il tuo esercito inoltre"
3920 PRINT" consumera' una grande quantita' di grano durante l'assedio e"
3930 PRINT" potresti morire di fame nel castello se non dovessi avere abbastanza"
3940 PRINT" cibo nelle riserve di grano. Ti sara' presto chiesto se vuoi entrare"
3950 PRINT" in guerra o meno. Se la tua risposta e' si', dovrai decidere chi"
3960 PRINT" attaccare e se assoldare mercenari. Il tuo esercito verra' radunato"
3970 PRINT" e dopo aver ascoltato le impressioni dei tuoi nobili e del popolo"
3980 PRINT" ti verra' data la possibilita' di ripensarci ed eventualmente"
3990 PRINT" rinunciare all'attacco all'ultimo minuto, altrimenti suoneranno"
4000 PRINT" la carica e invaderanno... quando attacchi qualcuno, si presuppone"
4010 PRINT" che questi si ritiri nel proprio castello, con tutti gli effetti"
4020 PRINT" precedentemente descritti."
4030 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3720
4040 CLS:PRINT:PRINT" EVENTI CASUALI"
4050 COLOR 7,0:PRINT:PRINT" Circa a metà anno potrebbero accadere alcuni eventi che ridurranno"
4060 PRINT" le tue scorte di grano. Incendi, furti e altre calamita' naturali."
4070 PRINT" All'inizio dell'anno verra' proposta l'assunzione di un guardiano"
4080 PRINT" dei magazzini che vigilera' tutto l'anno affinche' le tue preziose"
4090 PRINT" riserve di grano stiano al sicuro. Ovviamente un esborso maggiore"
4100 PRINT" garantira' una presenza piu' attenta e costante del guardiano"
4110 PRINT" sull'area ma mai la certezza che non accada qualcosa."
4120 PRINT" Queste sono le opzioni (tra parentesi il compenso annuo richiesto"
4130 PRINT" e la probabilita' di presenza attenta nell'area):"
4140 PRINT" - Protezione dei tuoi servi","(0 fiorini - 20%)"
4150 PRINT" hanno gia' il loro lavoro, non gli si puo' chiedere molto."
4160 PRINT" - Gavino Dietisalvi",,"(1 fiorino - 35%)"
4170 PRINT" ama di sicuro piu' il tepore delle taverne che il lavoro."
4180 PRINT" - Guido Buonagiunta",,"(2 fiorini - 50%)"
4190 PRINT" sveglio un giorno, addormentato l'altro."
4200 PRINT" - Aldobrandino Bonensegna",,"(3 fiorini - 65%)"
4210 PRINT" valente lavoratore con grande spirito d'iniziativa."
4220 PRINT" - Ugolino Benecasa",,"(4 fiorini - 80%)"
4230 PRINT" gli affideresti le chiavi di una cintura di castita'."
4240 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 3830
4250 CLS:PRINT:PRINT" RIVOLTE, COSPIRAZIONI E PESTE"
4260 COLOR 7,0:PRINT:PRINT" Possono accadere tante altre cose al tuo maniero. Se i tuoi contadini"
4270 PRINT" fossero abbastanza arrabbiati potrebbero rivoltarsi, i tuoi nobili di"
4280 PRINT" norma dovrebbero essere in grado di gestirli. Se fossero invece loro"
4290 PRINT" non gradire il modo con cui gestisci il maniero, avrebbero di sicuro"
4300 PRINT" i loro modi per fartelo capire ed eventualmente toglierti di mezzo."
4305 PRINT" Una sera potresti trovarti la cena avvelenata (anche se non tutte le"
4310 PRINT" volte potrebbe trattarsi di un veleno letale)."
4320 PRINT" Inoltre, c'e' sempre una piccola probabilita' che scoppi la peste."
4330 PRINT" Puo' colpire il tuo maniero o quelli vicini o magari risparmiare"
4340 PRINT" l'intera area. Nulla e' scontato e i rapporti delle terre vicine non"
4350 PRINT" sono piu' che voci e dunque non devono sempre essere ascoltate."
4360 PRINT" Ricorda che se il tuo maniero venisse colpito dalla peste la probabi-"
4370 PRINT" lita' accada lo stesso anche a te e' alta..."
4380 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 4040
4390 CLS:PRINT:PRINT" LA MAPPA"
4400 COLOR 7,0:PRINT:PRINT" Nella prossima schermata verra' disegnata la mappa tipica che"
4410 PRINT" potrai consultare durante tutta la partita. Verra' presentata"
4420 PRINT" ogni anno almeno una volta a meno che non cambino i confini a"
4430 PRINT" seguito di guerre o compravendite pacifiche di terreno."
4440 PRINT" Bastera' spostare il cursore con le frecce direzionali,"
4450 PRINT" spostarsi sul riquadro che si desidera acquistare o vendere e"
4460 PRINT" premere invio o spazio."
4470 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 4250
4480 FOR A=1 TO 10:FOR B=1 TO 23:T(A,B)=176:NEXT:NEXT:FOR A=17 TO 22:FOR B=1 TO 40:T(A,B)=178:NEXT:NEXT
4490 FOR A=1 TO 5:FOR B=24 TO 40:T(A,B)=8:NEXT:NEXT:FOR A=9 TO 18:FOR B=30 TO 40:T(A,B)=15:NEXT:NEXT
4500 FOR A=9 TO 16:FOR B=16 TO 29:T(A,B)=219:NEXT:NEXT:FOR A=11 TO 18:FOR B=1 TO 15:T(A,B)=177:NEXT:NEXT:FOR A=10 TO 12:T(A,15)=219:NEXT:FOR A=1 TO 10:T(11,A)=176:NEXT
4510 FOR A=12 TO 15:T(18,A)=178:NEXT:FOR A=7 TO 8:FOR B=24 TO 31:T(A,B)=8:NEXT:NEXT:FOR A=38 TO 40:T(8,A)=15:NEXT:FOR A=24 TO 40:T(6,A)=8:NEXT:FOR A=16 TO 27:T(17,A)=219:NEXT
4520 FOR A=7 TO 8:FOR B=32 TO 40:T(A,B)=15:NEXT:NEXT:FOR A=32 TO 40:T(19,A)=15:NEXT:T(7,32)=8:T(17,28)=15:T(17,29)=15:FOR A=36 TO 40:T(20,A)=15:NEXT:FOR A=38 TO 40:T(21,A)=15:NEXT
4530 CLS:FOR A=1 TO 22:FOR B=1 TO 40:PRINT CHR$(T(A,B));:NEXT:PRINT:NEXT
4540 LOCATE 3,10:PRINT "Duca":LOCATE 4,11:PRINT "di":LOCATE 5,7:PRINT "Cinturanera"
4550 LOCATE 3,27:PRINT "Visconte di":LOCATE 4,27:PRINT "Comesichiama"
4560 LOCATE 14,4:PRINT "Barone di":LOCATE 15,4:PRINT "Tispiezzo-":LOCATE 16,6:PRINT"indue"
4570 LOCATE 12,19:PRINT "Conte di":LOCATE 13,19:PRINT "Vorreima-":LOCATE 14,19:PRINT "nonposso":LOCATE 15,21:PRINT "(tu)"
4580 LOCATE 11,33:PRINT "Conte":LOCATE 12,35:PRINT "di":LOCATE 13,32:PRINT "Cretin-":LOCATE 14,33:PRINT "burgo"
4590 LOCATE 21,6:PRINT "Marchese di Grandegrosso"
4600 LOCATE 12,42:PRINT "Ogni riquadro equivale a circa 12 acri."
4610 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 4390
4620 CLS:PRINT:PRINT" LEGENDA DEI COLORI"
4630 COLOR 7,0:PRINT:PRINT" Il testo apparira' in colori diversi per meglio identificare"
4640 COLOR 7,0:PRINT" le varie sezioni e risposte da parte del gioco:"
4650 COLOR 2,0:PRINT:PRINT" Le INDICAZIONI ed EVENTI POSITIVI saranno di colore VERDE."
4660 COLOR 7,0:PRINT" Le STATISTICHE saranno di colore BIANCO."
4670 COLOR 14,0:PRINT" Il tuo CONSIGLIERE parlera' in GIALLO."
4680 COLOR 4,0:PRINT" Gli EVENTI NEGATIVI saranno in ROSSO."
4690 COLOR 6,0:PRINT" Le sezioni della GUERRA e delle TASSE saranno in MARRONE."
4700 COLOR 3,0:PRINT" La GESTIONE DELLE TERRE sara' in AZZURRO."
4710 LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 4480
4720 CLS:COLOR 7,0:PRINT:PRINT" NOTE FINALI"
4730 PRINT" In risposta ad una domanda che prevede un si' o un no, non hai"
4740 PRINT" bisogno di digitare tutta la parola, bastera' la lettera 'S' o"
4750 PRINT" 's'. Ogni altra lettera verra' presa come un no, sebbene il"
4760 PRINT" programma sia in grado di prendere come risposta affermativa"
4770 PRINT" anche le seguenti possibili risposte:"
4780 PRINT" 'Si', spazziamoli via dalla faccia della terra!!!'"
4790 PRINT" 'si, voglio aumentare le dannate tasse al 70%!"
4800 PRINT:PRINT" Quando il gioco iniziera' ti verranno forniti:"
4810 PRINT" 150 uomini di cui 60 in salute"
4820 PRINT" 60 contadini"
4830 PRINT" 75 servi"
4840 PRINT" 15 nobili"
4850 PRINT" 150 moggi di grano"
4860 PRINT" 15 fiorini"
4870 PRINT" 1585 Acri di terreno, abbastanza per mantenere te e il popolo"
4880 PRINT" 1 castello per aiutarti a difenderti"
4890 PRINT:PRINT" Sei pronto per l'avventura che ti attende alla sola pressione"
4900 PRINT" di un tasto?":LOCATE 23,35:COLOR 15,0:PRINT"Premi un tasto per continuare o (i)ndietro":X$=INPUT$(1):IF X$="i" THEN 4620 ELSE 65

Inviato da: chipkoil 18 Aug 2018, 16:49

Che gioco è? Con Manor ho trovato troppi risultati diversi

Inviato da: TheRuleril 18 Aug 2018, 19:35

E' un gioco manageriale testuale. http://www.oldgamesitalia.net/forum/index.php?s=&showtopic=24676&view=findpost&p=369475.

Inviato da: TheRuleril 22 Aug 2018, 19:19

Diario di bordo.
Per i registri, il diagramma di flusso aggiustato del calcolo delle tasse in MANOR.
in basso a dx i tre tipi di tassa espressa in fiorini e moggi, per il terreno, il raccolto e i tuoi guadagni personali.


 

Inviato da: chipkoil 23 Aug 2018, 06:39

Non sto capendo assolutamente niente ma è evidente che sei molto bravo. n5.gif
Quando hai finito magari faccio un giro di prova.



Inviato da: TheRuleril 23 Aug 2018, 12:32

Esagerato, ma grazie. Ho riportato a diagramma per avere meglio chiaro il flusso delle variabili e capire quali e come influenzano le formule.


Piccolo bug che capita rarissimamente, ma capita. Anche nel gioco originale.
Subscript out of range in 2070.


Ad un certo punto del gioco il programma disegna la mappa e posiziona il cursore in riga 13 e colonna 22



CODICE
60 DIM T(22,40)
...
1250 PRINT CHR$(T(A,B));:NEXT:PRINT:NEXT:IF RT=1 THEN 2070
...
2070 RT=0:COLOR CL(B1):LOCATE 12,42:PRINT "Choose which will be transacted":LOCATE 13,44:PRINT "with the "D$(B1)":":LOCATE 15,56:PRINT STRING$(2,SE(B1)):A=13:B=22
2090 A$=INKEY$:IF A$="" THEN 2090
2100 IF LEN(A$)=1 THEN 2150 ELSE A$=RIGHT$(A$,1)
2110 IF A$="K" THEN A$="4" ELSE IF A$="M" THEN A$="6"
2120 IF A$="H" THEN A$="8" ELSE IF A$="P" THEN A$="2"
2130 IF A$="G" THEN A$="7" ELSE IF A$="I" THEN A$="9"
2140 IF A$="O" THEN A$="1" ELSE IF A$="Q" THEN A$="3"
2150 IF A$="1" OR A$="2" OR A$="3" THEN LOCATE A,B:PRINT CHR$(T(A,B)):A=A+1
2160 IF A$="7" OR A$="8" OR A$="9" THEN LOCATE A,B:PRINT CHR$(T(A,B)):A=A-1
2170 IF A$="9" OR A$="6" OR A$="3" THEN LOCATE A,B:PRINT CHR$(T(A,B)):B=B+1
2180 IF A$="7" OR A$="4" OR A$="1" THEN LOCATE A,B:PRINT CHR$(T(A,B)):B=B-1
2190 IF VAL(A$)=0 THEN 2210
2200 GOTO 2080


non dovrebbe essere un problema del cursore visto che viene posizionato all'interno dell'array e difatti ho provato a dividere la riga in due così:

CODICE
2070 RT=0:COLOR CL(B1):LOCATE 12,42:PRINT "Choose which will be transacted":LOCATE 13,44:PRINT "with the "D$(B1)":"
2071 LOCATE 15,56:PRINT STRING$(2,SE(B1)):A=13:B=22


e l'errore di subscript è sempre in 2070 e avviene sempre DOPO aver disegnato correttamente la mappa e prima di disegnare il cursore.
La variabile CL è legata al nobile con cui fare la transazione (B1) e ne definisce il colore. Se il nobile è il numero 5 allora CL è bianco ( COLOR 7) ecc...

Ho provato ad aumentare le dimensioni dell'array a 24,80 ma l'errore compare lo stesso.

help?

Inviato da: DKil 23 Aug 2018, 13:57

L'errore indica che stai usando un indice al di fuori della dimensione valida. Es. hai un array da 1 a 10 e provi a chiedere l'elemento 12.
Ad occhio, in quella riga, mi pare i colpevoli possano essere COLOR CL(B1) e D$(B1), magari stampa da qualche parte il valore di B1 per vedere se assume valori al di fuori dell'intervallo consentito. Considera che anche valori negativi non vanno bene.

Inviato da: TheRuleril 23 Aug 2018, 17:46

Giusto! grande DK.
In effetti va in crash DOPO aver disegnato la mappa e PRIMA di scrivere a destra "Choose..."
Basta che stampi B1 prima di quel COLOR. E poi un po' di betatest.

Inviato da: TheRuleril 25 Aug 2018, 00:25

Al momento ho stampato tutte le variabili coinvolte nella routine sulla destra. In caso di crash sapremo dunque quale variabile lo ha causato.


Ho colto l'occasione per risolvere anche una eccezione non gestita dal programma originale.
Quando vuoi vendere o comperare terra il gioco ti fa spostare con i tasti freccia un cursore per selezonare gli acri.
Nella versione originale se esci da uno dei bordi della mappa il gioco va in crash. Sbagliando lo impari così eviti di avvicinarsi ai bordi, ma non mi pareva una scelta elegante quella di lasciare le cose come stavano.

Ho inserito quattro condizioni per cui se il cursore esce dalle coordinate 0-40 orizzontali e 0-23 verticali, le coordinate sono riportate allo stato precedente lo spostamento.

Inoltre lo spostamento del cursore creava un artefatto. La freccina lasciava una traccia verde lungo tutto il percorso. Bug carino ma anche no.

E' bastato intercettare il print del cursore e cambiargli il colore in accordo con la porzione di mappa sottostante.
Ora oltre a non lasciare più traccia, il cursore emette un bip a frequenza bassa se colpisce un bordo mappa.


Per i registri il codice originale:

CITAZIONE
2070 RT=0:COLOR CL(B1):LOCATE 12,42:PRINT "Choose which will be transacted":LOCATE 13,44:PRINT "with the "D$(B1)":":LOCATE 15,56:PRINT STRING$(2,SE(B1)):A=13:B=22
2080 COLOR 2:LOCATE A,B:PRINT CHR$(26)
2090 A$=INKEY$:IF A$="" THEN 2090
2100 IF LEN(A$)=1 THEN 2150 ELSE A$=RIGHT$(A$,1)
2110 IF A$="K" THEN A$="4" ELSE IF A$="M" THEN A$="6"
2120 IF A$="H" THEN A$="8" ELSE IF A$="P" THEN A$="2"
2130 IF A$="G" THEN A$="7" ELSE IF A$="I" THEN A$="9"
2140 IF A$="O" THEN A$="1" ELSE IF A$="Q" THEN A$="3"
2150 IF A$="1" OR A$="2" OR A$="3" THEN LOCATE A,B:PRINT CHR$(T(A,B)):A=A+1
2160 IF A$="7" OR A$="8" OR A$="9" THEN LOCATE A,B:PRINT CHR$(T(A,B)):A=A-1
2170 IF A$="9" OR A$="6" OR A$="3" THEN LOCATE A,B:PRINT CHR$(T(A,B)):B=B+1
2180 IF A$="7" OR A$="4" OR A$="1" THEN LOCATE A,B:PRINT CHR$(T(A,B)):B=B-1
2190 IF VAL(A$)=0 THEN 2210
2200 GOTO 2080
2210 IF T(A,B)=SE THEN T(A,B)=SE1:SE2=SE2-1:LOCATE A,B:PRINT CHR$(T(A,B))
2220 IF SE2=>.5 THEN 2080 ELSE CLS:RETURN


e quello modificato (in giallo le modifiche per il cursore, in rosso l'aggiunta delle variabili per il debug):
CITAZIONE
2070 RT=0:A=13:B=22:LO=2:LOCATE 1,52:PRINT "DEBUG":LOCATE 2,52:PRINT "B1:"B1" CL:"CL" CL(BL)"CL(B1)
2071 LOCATE 3,52:PRINT "A:"A" B:"B:LOCATE 4,52:PRINT "T(A,B):"T(A,B):LOCATE 5,52:PRINT "SE1:"SE1:LOCATE 6,52:PRINT "SE2:"SE2:LOCATE 7,52
2072 PRINT "SE:"SE:LOCATE 8,52:PRINT "VAL(A$):"VAL(A$):LOCATE 9,52:PRINT "LT:"LT" LT1:"LT1:LOCATE 10,52:PRINT "AB:"AB" AB1:"AB1

2079 LOCATE 12,50:COLOR CL(B1):PRINT "Seleziona il terreno":LOCATE 13,46:PRINT "per il "D$(B1)":":LOCATE 15,59:PRINT STRING$(2,SE(B1))
2080 IF A<1 THEN SOUND 37,1:A=A+1
2081 IF A>22 THEN SOUND 37,1:A=A-1
2082 IF B<1 THEN SOUND 37,1:B=B+1
2083 IF B>40 THEN SOUND 37,1:B=B-1

2084 COLOR LO:LOCATE A,B:PRINT CHR$(26)
2090 A$=INKEY$:IF A$="" THEN 2090
2100 IF LEN(A$)=1 THEN 2150 ELSE A$=RIGHT$(A$,1)
2110 IF A$="K" THEN A$="4" ELSE IF A$="M" THEN A$="6"
2120 IF A$="H" THEN A$="8" ELSE IF A$="P" THEN A$="2"
2130 IF A$="G" THEN A$="7" ELSE IF A$="I" THEN A$="9"
2140 IF A$="O" THEN A$="1" ELSE IF A$="Q" THEN A$="3"
2150 IF A$="1" OR A$="2" OR A$="3" THEN LOCATE A,B:PRINT CHR$(T(A,B)):A=A+1
2160 IF A$="7" OR A$="8" OR A$="9" THEN LOCATE A,B:PRINT CHR$(T(A,B)):A=A-1
2170 IF A$="9" OR A$="6" OR A$="3" THEN LOCATE A,B:PRINT CHR$(T(A,B)):B=B+1
2180 IF A$="7" OR A$="4" OR A$="1" THEN LOCATE A,B:PRINT CHR$(T(A,B)):B=B-1
2181 IF T(A,B)=219 THEN LO=2 ELSE IF T(A,B)=176 THEN LO=13 ELSE IF T(A,B)=177 THEN LO=11 ELSE IF T(A,B)=178 THEN LO=14 ELSE IF T(A,B)=15 THEN LO=12 ELSE IF T(A,B)=8 THEN LO=15
2189 LOCATE 3,52:PRINT "A:"A" B:"B:LOCATE 4,52:PRINT "T(A,B):"T(A,B):LOCATE 5,52:PRINT "SE1:"SE1:LOCATE 6,52:PRINT "SE2:"SE2:LOCATE 7,52
2190 PRINT "SE:"SE:LOCATE 8,52:PRINT "VAL(A$):"VAL(A$):LOCATE 9,52:PRINT "LT:"LT" LT1:"LT1:LOCATE 10,52:PRINT "AB:"AB" AB1:"AB1

2191 IF VAL(A$)=0 THEN 2210
2200 GOTO 2080
2210 IF T(A,B)=SE THEN T(A,B)=SE1:SE2=SE2-1:LOCATE A,B:PRINT CHR$(T(A,B))
2220 IF SE2=>.5 THEN 2080 ELSE CLS:RETURN

Inviato da: TheRuleril 27 Aug 2018, 22:02

Trovato bug anche nel gioco originale. Non so ancora se dipenda dal programma o dall'emulatore.
Mi è capitato diverse volte che andasse in crash dopo una battaglia.

Ho messo dei print in tutte le righe coinvolte nel loop di calcoli (1900-2030).

CITAZIONE
1890 PRINT "Il nemico ha subito"WC"perdite."
1900 PRINT"1";:AB=0:TM=VAL(TIME$)*60+VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2))/60:IF WL(I)=0 THEN ABA=0 ELSE ABA=INT(WL/12)
1910 PRINT"2";:AB1=0:GOSUB 2770:A=INT(RND*21+1):B=INT(RND*40+1):IF T(A,B)<>LT1 THEN 1910 ELSE FOR A1=A-1 TO A+1 STEP 2:FOR B1=B-1 TO B+1 STEP 2:IF A1>22 THEN A1=20
1920 PRINT"3";:IF B1>40 THEN B1=38
1930 PRINT"4";:IF T(A1,B1)=LT THEN T(A,B)=LT:AB1=1
1940 PRINT"5";:IF AB1=0 THEN 1990 ELSE FOR A1=A-1 TO A+1:FOR B1=B-1 TO B+1:IF A1>22 THEN A1=20
1950 PRINT"6";:IF B1>40 THEN B1=38
1960 PRINT"7";:IF T(A1,B1)=LT1 THEN T(A1,B1)=LT:AB1=AB1+1
1970 PRINT"8";:IF AB+AB1=>ABA THEN 2040
1980 NEXT:NEXT
1990 NEXT:NEXT:IF AB1>0 THEN AB=AB+AB1:NS(I)=NS(I)-AB1:IF NS(I)<1 THEN AB=ABA
2000 PRINT"9";:IF (VAL(TIME$)*60+VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2))/60)-TM>.3 THEN AB=ABA:GOTO 1970
2010 PRINT"A";:IF AB<ABA THEN 1910
2020 PRINT"B";:IF J<5 THEN 1440
2030 PRINT"C";:IF GS=1 THEN GS=0:GOTO 1850
2040 GOTO 2340

Un output tipico post battaglia (con i print):

Le due volte che mi è ricapitato si è fermato (PC-BASIC IN CRASH) al "9".
2000 PRINT"9";:IF (VAL(TIME$)*60+VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2))/60)-TM>.3 THEN AB=ABA:GOTO 1970
TM è dichiarata una sola volta in 1900:
TM=VAL(TIME$)*60+VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2))/60

Nella routine sopra, che ridisegna i confini e assegna gli acri di terra, l'autore ha messo in mezzo il tempo...
Ho provato con questo programmino per vedere la condizione e,non vorrei dire una corbelleria, credo lo abbia inserito per dare un tempo massimo dopo di che fa uscire il loop.

CITAZIONE
10 CLS:TM=VAL(TIME$)*60+VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2))/60:A1=TIMER
20 A2=TIMER:LOCATE 1,1:PRINT "Attendere..."A2
25 IF (VAL(TIME$)*60+VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2))/60)-TM>.3 THEN 30 ELSE 20
30 PRINT "sono passati"A2-A1"secondi"


il tempo massimo è sempre di circa 17 secondi
Credo si possa usare la semplice variabile TIMER come ho fatto nel programmino per calcolare i secondi passati.
Assegno ad A1 il valore di TIMER in quel momento e poi incremento A2. Quando la differenza è 17 mi fermo.

CITAZIONE
10 CLS:A1=TIMER
20 A2=TIMER:LOCATE 1,1:PRINT "Attendere..."A2
25 IF A2-A1>17 THEN 30 ELSE 20
30 PRINT "sono passati"A2-A1"secondi"


Che dite? Il calcolo, per quanto astruso, non mi sembra sopra le possibilità di GW Basic, è probabile che sia un problema di PC-BASIC (anche se il programmino che ho creato non va mai in crash, ma forse è dovuto al fatto che c'è solo quello e non tutto MANIERO dietro)
Testo e se non ci sono anomalie procedo alla semplificazione del calcolo di TM, visto che principalmente per giocare si userà l'emulatore e non l'ambiente GW Basic DOS. Principalmente.

Inviato da: TheRuleril 29 Aug 2018, 20:57

Non riesco a capire come impostare una condizione. Chiedo aiuto.

Ho bisogno che la variabile PT che rappresenta la percentuale di tasse alla popolazione soddisfi determinate condizioni:
non sia minore di zero, non sia maggiore di 100, se maggiore di 30 chiede conferma ecc... tutte condizioni che possono coesistere, ma se metto in mezzo questa non riesco a trovare la soluzione: se batto invio senza scrivere nulla PT deve mantenere il valore precedente.

Ecco come l'ho buttata giù:

CODICE
720 PRINT "Tasse (scorso anno"STR$(PT)"%) ";:INPUT PT1:IF PT1>0 AND PT1<=30 THEN PT=PT1 ELSE IF PT1=null THEN 721 ELSE IF PT1>100 THEN 720 ELSE IF PT1>30 THEN INPUT " Sicuro (s/n)";A$:IF A$<>"S" AND A$<>"s" THEN 720 ELSE PT=PT1
721 PRINT PT PT1:GOTO 720

Funziona, ma ovviamente non gestisce il valore 0 (minimo 1%) e io devo poter mettere le tasse a zero.
Il fatto è che l'invio genera un valore null, che in fase condizionale è gestito come 0 e questo crea un duplicato.
Idee?

Inviato da: TheRuleril 31 Aug 2018, 20:31

l'autore parla del bug in cui mi sono imbatttuto del possibile crash durante l'aggiornamento della mappa (manco fosse apple maps).

CITAZIONE
One issue you're likely to run into if you play for a while is that the game seems to hang sometimes right after a war. It probably hasn't, in fact. Following a war, the game updates the map to reflect the change in land ownership (X conquered N acres from Y). It uses, I think, a fairly inefficient method--selecting a square at random, checking to see if that square is on the border between the two manors, and if so, changing its ownership. This was a simple way to ensure that it would work anywhere on the map, even if the borders got pretty distorted, and it avoided making changes starting from the top right or some other recognizable pattern. The trouble is that it can sometimes take a while to find a square that's along the border. It also happens in rare cases that two formerly neighboring manors have lost their common border, so it won't be able to find qualifying squares in any case. Similarly, there's a rare bug that I never did track down, where one manor will attack another that it never has bordered: the Baron (on the left) attacking the Earl (on the right), for instance. To make sure the game does move on at some point, I added a timer that will eventually make it stop looking for squares and proceed with the game; it times out after a minute or two, I think. (Unfortunately I think there are also some rare instances where this part of the game really does hang, but I've never been able to verify it.)

per ora il mio "workaround" funziona, test hanno dato esito positivo.

Inviato da: DKil 1 Sep 2018, 09:23

QUOTE
Funziona, ma ovviamente non gestisce il valore 0 (minimo 1%) e io devo poter mettere le tasse a zero.
Il fatto è che l'invio genera un valore null, che in fase condizionale è gestito come 0 e questo crea un duplicato.
Idee?

Non programmo col gwbasic/basic da oltre 20 anni, quindi la memoria è quella che è blush.gif però, che io ricordi, il null non l'ho mai sentito, sicuro esista?
Comunque, secondo me INPUT restituisce una stringa, quindi se scrivi 0 è diverso da "vuoto", per cui il test lo farei con
IF PT1="" <- qui dovrebbe aver premuto invio senza aver scritto nulla e quindi puoi assegnare il valore dello scorso anno
IF PT1="0" se ha scritto il valore 0

Inviato da: TheRuleril 1 Sep 2018, 11:25

Grazie DK, anche per me sono più di 25 anni!;-) Ho provato per curiosità, magari è una funzione di pcbasic ma scrivere PT1=0 o PT1=null funziona uguale.
Per poter assegnare un valore "" o "0" ad una variabile questa deve essere una stringa (PT1$) e comunque viene considerata come testo, non come numero, per poter usare > e < PT1 deve essere una varibile numerica.
Da quello che ho capito e ricordo PT1$ accetta solo =(uguale) o <>(diverso), mentre PT1 accetterebbe anche < o >.
Se provo a mischiare le cose:

INPUT PT1$:IF PT1$="" THEN 730 ELSE IF PT1$<"0" OR PT1$>"70" THEN ...

l'invio me lo prende ed esce dalla condizione, ma se batto qualunque altra cosa da' TYPE MISMATCH.
La cosa che non capisco è perché se metto PT1$<20 me lo accetta senza dare errori ma non fa una mazza.

per usare PT1 come stringa dovrei creare una condizione tipo:
IF PT1$="" THEN 730 ELSE IF PT1$="0" AND PT1$="1" AND PT1$="2" AND PT1$="3" ... AND PT1$="70" THEN
ma verrebbe una riga mostruosa o anche 10 righe, e comunque non gestirebbe i valori DIVERSI da questi (condizione per cui ho un altro output), sono sicuro ci sia un metodo diverso.


Al momento l'ho messa così:

CITAZIONE
720 COLOR 6,0:PRINT "Tasse per i contadini ("STR$(PT)"% lo scorso anno )";:INPUT PT1:IF PT1<0 OR PT1>70 THEN COLOR 14:PRINT "Signore, i suoi contadini non potrebbero sostenere una tale balzello!":GOTO 720
721 IF PT1>30 THEN COLOR 14:INPUT " Ne e' sicuro, Signore (s/n)";A$:IF LEFT$(A$,1)<>"S" AND LEFT$(A$,1)<>"s" THEN 720
730 COLOR 6,0:PRINT "Tasse per i nobili ("STR$(NT)"% lo scorso anno )";:INPUT NT1:IF NT1<0 OR NT1>70 THEN COLOR 14:PRINT "Signore, i suoi nobili non ottempererebbero mai ad una tale gabella!":GOTO 730
731 IF NT1>30 THEN COLOR 14:INPUT " Ne e' sicuro, Signore (s/n)";A$:IF LEFT$(A$,1)<>"S" AND LEFT$(A$,1)<>"s" THEN 730
735 PT=PT1:NT=NT1

non puoi mettere un valore minore di zero o maggiore di 70 e se è maggiore di 30 chiede conferma. Invio e basta mette a zero.


Inviato da: DKil 1 Sep 2018, 22:08

Sì, giusto, il $ è per le stringhe.
Allora fai così: l'INPUT lo prendi come stringa in modo da differenziare "0" e "", dopodiché (dopo aver verificato e smistato quelle condizioni), converti il valore da stringa a intero (con VAL) e usi quest'ultima variabile per i confronti di < e >, che altrimenti, con le stringhe, forse non funzionano bene perché credo verificano il codice ascii della lettera e non il numero.

Inviato da: TheRuleril 2 Sep 2018, 01:21

L'uovo di Colombo. Grazie Andrea, mitico.

CODICE
720 LOCATE 22,1:COLOR 6,0:PRINT "Tasse per i contadini ("PT"% lo scorso anno )";:INPUT PT1$:IF PT1$="" THEN 730
721 IF VAL(PT1$)<0 OR VAL(PT1$)>70 THEN COLOR 14:PRINT "Signore, i suoi contadini non potrebbero sostenere una tale balzello!";:LOCATE 22,40:PRINT "                    ";:GOTO 720
722 GOTO 725
723 IF VAL(PT1$)>30 THEN LOCATE 22,54:COLOR 14:INPUT "Sicuro, Signore (s/n)";A$:IF LEFT$(A$,1)<>"S" AND LEFT$(A$,1)<>"s" THEN LOCATE 22,45:PRINT "                                  ":GOTO 720
724 GOTO 726
725 LOCATE 23,1:PRINT "                                                                               ";:GOTO 723
726 LOCATE 22,54:PRINT "                        "
727 PT=VAL(PT1$)
730 LOCATE 23,1:COLOR 6,0:PRINT "Tasse per i nobili ("NT"% lo scorso anno )";:INPUT NT1$:IF NT1$="" THEN 740
731 IF VAL(NT1$)<0 OR VAL(NT1$)>70 THEN COLOR 14:PRINT "Signore, i suoi nobili non ottempererebbero mai ad una tale gabella!";:LOCATE 23,40:PRINT "                    ";:GOTO 730
732 GOTO 735
733 IF VAL(NT1$)>30 THEN LOCATE 23,54:COLOR 14:INPUT "Sicuro, Signore (s/n)";A$:IF LEFT$(A$,1)<>"S" AND LEFT$(A$,1)<>"s" THEN LOCATE 23,42:PRINT "                                    ":GOTO 730
734 GOTO 736
735 LOCATE 24,1:PRINT "                                                                               ";:GOTO 733
736 LOCATE 23,54:PRINT "                        "
737 NT=VAL(NT1$)

I print con gli spazi servono a cancellare da schermo quello che non serve più. Non so se esiste ma sarebbe comodo un LOCATE Y:DELETE LINE



Inviato da: DKil 2 Sep 2018, 08:14

Non ricordo per cancellare una riga, forse con un peek direttamente nella memoria video, però, volendo puoi creare una stringa di 80 spazi (anche con un ciclo FOR) e usare quella variabile nelle PRINT, così il codice dovrebbe essere un po' più leggibile.

Inviato da: TheRuleril 3 Sep 2018, 10:17

a volte cancello solo porzioni di 10 caratteri; per come ho posizionato il testo mi serve che sparisca solo quella parte e non tutta la riga, solo 2 volte la riga intera. Potrei fare con la variabile, in effetti non sarebbe male. Devo vedere di standardizzare la porzione da coprire.
Non saprei però come fare con il FOR. Cosa intendi? per ogni carattere che manca fino a fine riga sposto in avanti il cursore e cancello?

Ho una nuova cosina da fare.
Ho creato la tabella degli highscore in un file separato (maniero.hi) così composto:

CODICE
Punti, Nobile, Anno, Eta', Turni, Pop, Acri, Fiorini, Moggi, Morte
619,theruler, 1331, 34, 12, 471, 4393, 670, 19967,avvelenato
78,theruler, 1323, 28, 4, 155, 1155, 27, 1202,avvelenato
41,theruler, 1321, 23, 2, 156, 1165, 29, 930,impiccato
...


CITAZIONE
5309 REM ****** ROUTINE SALVATAGGIO HIGHSCORE RICHIAMATA DA 2980 ******
5310 PRINT:PRINT:COLOR 7,0:INPUT"Immetti il tuo nome (massimo 8 caratteri): ",NO$
5312 OPEN "A",1,"MANIERO2.HI"
5313 PRINT#1,STR$(PUN)","NO$","STR$(AN)","STR$(Y)","STR$(TU)","STR$(150+NAT)","STR$(L)","STR$(FI)","STR$(GT)","MOT$
5322 CLOSE#1:PRINT"Punteggi salvati.":RETURN
2323 REM ****** ROUTINE LETTURA HIGHSCORE RICHIAMATA DA 2980 ******
5324 OPEN "I",1,"MANIERO2.HI"
5325 WHILE NOT EOF(1):INPUT#1,A$,B$,C$,D$,E$,F$,G$,H$,I$,J$
5326 PRINT A$ TAB(7);B$ TAB(17);C$ TAB(23);D$ TAB(29);E$ TAB(36);F$ TAB(41);G$ TAB(47);H$ TAB(56);I$ TAB(63);J$:WEND
5327 CLOSE#1:RETURN


Il comando appende alla fine del file le variabili convertendo le numeriche in testo così evito gli spazi.
In fase di rilettura ristampo tutte le righe in sequenza.
Non ho però ancora trovato il modo di ordinare le righe per punteggio.
Poi non so se conviene farlo fare ad una routine a parte, durante la scrittura o durante la lettura dei dati, cioè lasciare su file i dati a caso e ordinare a video che so, solo i primi 20.

Inviato da: DKil 3 Sep 2018, 16:23

QUOTE
Non saprei però come fare con il FOR. Cosa intendi? per ogni carattere che manca fino a fine riga sposto in avanti il cursore e cancello?

Esatto, tipo scrivi uno spazio da colonna 20 a colonna 35, una roba tipo FOR I da ColonnaInizio a ColonnaInizio+lunghezza

QUOTE
Non ho però ancora trovato il modo di ordinare le righe per punteggio.
Poi non so se conviene farlo fare ad una routine a parte, durante la scrittura o durante la lettura dei dati, cioè lasciare su file i dati a caso e ordinare a video che so, solo i primi 20.

Un quick sort per punteggio ovviamente.
Conviene farlo durante la scrittura o la lettura? Con i pc di oggi, non ha importanza, ma, prestazionalmente, conviene farlo nella procedura che viene usata meno. Cioè, se son più le letture che le scritture, conviene che il processo di sort sia fatto in fase di scrittura così quando legge non deve far nulla.

Inviato da: TheRuleril 4 Sep 2018, 09:48

Potrei in fase di lettura fare un check sulla riga X del file, se la variabile PUN è maggiore del primo valore della riga allora manda un RETURN e scrivi la stringona dei punteggi, altrimenti vai alla riga X+1 WHILE EOF(1).

Tutto molto facile... a parole!

CODICE
5310 PRINT:PRINT:COLOR 7,0:INPUT"Immetti il tuo nome (massimo 8 caratteri): ",NO$
5312 OPEN "A",1,"MANIERO2.HI"
5313 PRINT#1,STR$(PUN)","NO$","STR$(AN)","STR$(Y)","STR$(TU)","STR$(150+NAT)","STR$(L)","STR$(FI)","STR$(GT)","MOT$
5322 CLOSE#1:PRINT"Punteggi salvati.":RETURN

Inviato da: TheRuleril 6 Sep 2018, 18:46

CITAZIONE
Esatto, tipo scrivi uno spazio da colonna 20 a colonna 35, una roba tipo FOR I da ColonnaInizio a ColonnaInizio+lunghezza


Fatto. Mi sto dedicando alla pulizia del codice. Mi sono accorto che a forza di aggiungere feature sto esaurendo lo spazio. Max 60300 Bytes, spazio per variabili e array compreso. Il Qbasic non era così limitato:
CITAZIONE
6012 Y=2:DA=69:GOSUB 8080
...
8080 FOR X=DA TO 80:LOCATE Y,X:PRINT " ";:NEXT:RETURN



Però ovviamente ho un'altra domandona ;-):
Devo convertire una variabile numerica definita in un array all'interno di un ciclo FOR-NEXT, in una stringa.
Ovviamente mi da' Type mismatch:

CITAZIONE
8021 FOR A=1 TO 5:GOSUB 2770:SPA=INT(RND*1+.5):IF SPA=0 THEN SPYA(A)=INT(WL(A)*(RND*.2+.9)) ELSE SPYA(A)="****"
8022 NEXT


sono costretto ad usare numeri:
SPYA(A)=9999 così funziona ma stampa 9999 mentre a me serve un carattere generico tipo xxxx o **** che indichi una "mancanza di dato".

Posso convertire con CVI o MKS$ ma il fatto è che il ciclo FOR non mi prende SPYA(A), che fa parte di un array, come stringa.
So che si può fare ma non trovo la via giusta.
Devo convertire una variabile numerica in testo. Oppure trovare un carattere speciale accettato come numero.

Magari se usassi una variabile temporanea e la convertissi FUORI dal ciclo for?

Inviato da: DKil 6 Sep 2018, 21:29

Ma gli array di stringhe, in basic, non hanno sempre il $ famoso?
SPYA -> array di interi
SPYA$ -> array di stringhe

P.S. Ormai lo puoi riscrivere in QBasic o in Pascal, fai prima blush.gif

Inviato da: TheRuleril 7 Sep 2018, 10:13

Sì è così. Mi serve che una variabile in un array di interi venga trasformata all'occorrenza in una stringa.

CITAZIONE
8011 IF SPY=0 THEN FOR A=1 TO 5:SPYA(A)=9999:SPYF$(A)="********":SPYP(A)=999:NEXT
8012 IF SPY=1 THEN 8021
8013 IF SPY=2 THEN FOR A=1 TO 5:SPYA(A)=INT(WL(A)*(RND*.2+.9)):SPYF$(A)=L$(INT(FF(A)/10)):SPYP(A)=INT(PP(A)*(RND*.2+.9)):NEXT
8014 RETURN
8021 FOR A=1 TO 5:GOSUB 2770:SPA=INT(RND*1+.5):IF SPA=0 THEN SPYA(A)=INT(WL(A)*(RND*.2+.9)) ELSE SPYA(A)=9999
8022 NEXT
8023 FOR A=1 TO 5:GOSUB 2770:SPF=INT(RND*1+.5):IF SPF=0 THEN SPYF$(A)=L$(INT(FF(A)/10)) ELSE SPYF$(A)="********"
8024 NEXT
8025 FOR A=1 TO 5:GOSUB 2770:SPP=INT(RND*1+.5):IF SPP=0 THEN SPYP(A)=INT(PP(A)*(RND*.2+.9)) ELSE SPYP(A)=999
8026 NEXT
8027 RETURN


*(RND*.2+.9) Questo serve a rendere il dato approssimativo, +-10%
a seconda si utilizzino 0, 1 o 2 spie il rapporto cambia. Con 0 è così:

CODICE
1 ░░ Duca Cinturanera       9999 acri (********),  999 abitanti                
2 ▒▒ Barone Tispiezzoindue  9999 acri (********),  999 abitanti                
3 ▓▓ Marchese Grandegrosso  9999 acri (********),  999 abitanti                
4 ☼☼ Conte Vattelapesca     9999 acri (********),  999 abitanti                
5 ◘◘ Visconte Comesichiama  9999 acri (********),  999 abitanti


al posto dei 9 mi piacerebbe usare gli ** o XX come ho potuto fare con SPYF$(A) che è già un array di stringhe.

con 1 invece ogni campo ha una probabilità di essere popolato del 50%, e mi piacerebbe che fosse così:
CODICE
Il rapporto delle nostre spie, Signore:                                        
                                                                                
1 ░░ Duca Cinturanera       **** acri (********),  294 abitanti                
2 ▒▒ Barone Tispiezzoindue  **** acri (a maggese), 139 abitanti                
3 ▓▓ Marchese Grandegrosso  1692 acri (********),  *** abitanti                
4 ☼☼ Conte Vattelapesca     **** acri (a maggese), *** abitanti                
5 ◘◘ Visconte Comesichiama  1214 acri (********),  *** abitanti                
                                                                                
Chi desidera invadere, Eccellenza (1-5)?

Più leggibile.

Inviato da: DKil 7 Sep 2018, 16:14

Non ho capito bene, ma basta crearsi una serie di convenzioni. Es. mi pare che il 9999 non ha senso di esser stampato (o usa un numero che sicuramente non può esserci, tipo -1, non so), e in fase di stampa fai i controlli; se la variabile è uguale a 9999 allora stampi gli * altrimenti stampi il valore contenuto nella variabile.

Inviato da: TheRuleril 10 Sep 2018, 00:14

Alla fine ho deciso per il cambio in fase di print. Non elegantissimo e forse un po' macchinoso ma funziona.

CITAZIONE
2351 CLS:PRINT:PRINT "Il rapporto delle nostre spie, Signore:":PRINT:FOR A=1 TO 5:COLOR CL(A):PRINT A;STRING$(2,SE(A));" "D$(A);:IF SPYA(A)=9999 AND D$(A)<>"provincia" THEN PRINT TAB(32)"#### ";
2352 IF SPYA(A)<>9999 AND D$(A)<>"provincia" THEN PRINT TAB(31)SPYA(A);
2353 IF D$(A)<>"provincia" THEN PRINT "acri ("SPYF$(A)")"TAB(54)"e";
2354 IF SPYP(A)=999 AND D$(A)<>"provincia" THEN PRINT TAB(56)"###";:
2355 IF SPYP(A)<>999 AND D$(A)<>"provincia" THEN PRINT TAB(55)SPYP(A);:
2356 IF D$(A)<>"provincia" THEN PRINT TAB(60)"abitanti" ELSE PRINT
2357 NEXT
...
8010 REM ****** ROUTINE RAPPORTO SPIE RICHIAMATA DA 740 VISUALIZZATA POI DA 2351 ******
8011 IF SPY=0 THEN FOR A=1 TO 5:SPYA(A)=9999:SPYF$(A)="#########":SPYP(A)=999:NEXT
8012 IF SPY=1 THEN 8021
8013 IF SPY=2 THEN FOR A=1 TO 5:SPYA(A)=INT(WL(A)*(RND*.2+.9)):SPYF$(A)=L$(INT(FF(A)/10)):SPYP(A)=INT(PP(A)*(RND*.2+.9)):NEXT
8014 RETURN
8021 FOR A=1 TO 5:GOSUB 2770:SPA=INT(RND*1+.5):IF SPA=0 THEN SPYA(A)=INT(WL(A)*(RND*.2+.9)) ELSE SPYA(A)=9999
8022 NEXT
8023 FOR A=1 TO 5:GOSUB 2770:SPF=INT(RND*1+.5):IF SPF=0 THEN SPYF$(A)=L$(INT(FF(A)/10)) ELSE SPYF$(A)="#########"
8024 NEXT
8025 FOR A=1 TO 5:GOSUB 2770:SPP=INT(RND*1+.5):IF SPP=0 THEN SPYP(A)=INT(PP(A)*(RND*.2+.9)) ELSE SPYP(A)=999
8026 NEXT
8027 RETURN


Output tipico, se un maniero avversario è stato conquistato tolgo tutti i dati (che sarebbero comunque a 0) lasciando solo "provincia"
CODICE
Il rapporto delle nostre spie, Signore:                                        
                                                                                
1 ░░ provincia                                                                
2 ▒▒ Barone Tispiezzoindue    #### acri (#########) e ### abitanti            
3 ▓▓ provincia                                                                
4 ☼☼ Conte Vattelapesca       #### acri (#########) e ### abitanti            
5 ◘◘ Visconte Comesichiama    #### acri (#########) e ### abitanti            
                                                                                
Chi desidera invadere, Eccellenza (1-5, invio per annullare)?

Inviato da: TheRuleril 11 Sep 2018, 00:28

La potenza è nulla senza il controllo (TOTALE)! MUHAHAHAHAHAHA!


 

Inviato da: Vlad123il 11 Sep 2018, 10:10

Interessante io però ho problemi a giocarci non so proprio come farlo partire su Windows 10! :(

Inviato da: TheRuleril 11 Sep 2018, 16:12

Ciao Vlad! devi usare un interprete. PC-BASIC, funziona più o meno come dosbox.

Una volta avviato:

load "maniero2" [invio]
run [invio]


hai PM

Inviato da: Vlad123il 14 Sep 2018, 08:42

Allora se provo a caricare istruzioni dice che non le trova.
Quindi non so come salvare! biggrin2a.gif
Alla terza partita ho deciso di fare una guerra e ho vibto prendendo un sacco di terra a tispezzo in due.
Sfortunatamente il gioco si blocca dicendo "PC-Basic ha smesso di funzionare" ma che... Nelle partite successive spesso mi dice: sei molto popolare tra i nobili/contadini/servi poi una linea dopo dice sono Inc... Neri e ti attaccano (ma che...) Poi non capisco come funzionano le guerre dopo quell'unica guerra vinta le ho perse tutte! :(

Inviato da: TheRuleril 14 Sep 2018, 09:00

Se non trova le istruzioni non hai copiato tutti e due i file nella dir di PC-BASIC, maniero2.bas e maniero2.int.
Senza leggere le istruzioni in effetti non è facile comprendere a fondo Maniero.

Le variabili in questo gioco sono (contate) 189. I calcoli sono relativamente complessi e quello che succede dipende principalmente dalle scelte che uno fa ma anche da una piccola percentuale di casualità. Tutti i rapporti sono "indicativi", le informazioni giunte all'orecchio del feudatario erano anche create per non scontentarlo... ;-)
E' comunque normale che non si riesca ad accontentare tutti i nobili, uno scontento potrebbe esserci, ed uno socntento che tenta di ucciderti, anche. Gli algoritmi ne tengono conto.

Le guerre si basano su un indice (la variabile ARMY, nel codice). Questo indice è influenzato dal numero di persone in buona salute per ogni casta (contadini, servi, nobili), sono questi che combattono, e dal loro morale. Più i numeri sono alti più si alza l'indice. Inoltre puoi aumentarlo assoldando mercenari.
Il calcolo viene fatto tra l'indicatore avversario e il tuo, più una certa percentuale di casualità.
Considera che gli avversari hanno forze diverse date dal loro popolo e dalle dimensioni del loro castello. in senso orario, dal 5 (debole) al 1 (fortissimo).

Inviato da: Vlad123il 14 Sep 2018, 09:24

Io credevo fosse il 2 il più debole. No li ho messi tutti e due però non me le dà.

Inviato da: TheRuleril 14 Sep 2018, 11:21

Che errore esatto ti esce?

Inviato da: Vlad123il 14 Sep 2018, 13:13

File not found 238

Inviato da: TheRuleril 14 Sep 2018, 20:17

Non esiste la riga 238. Sicuro sia quello l'errore?
Hai messo come ti ho scritto sopra, i due file nella cartella di pc-basic?

Inviato da: Vlad123il 15 Sep 2018, 08:28

Si le ho messe giuro! Appena ho tempo provo il nuovo file!

Inviato da: TheRuleril 19 Sep 2018, 22:13

Cosiglio.

La forza della tua armata e di quelle avversarie sono condensate in un indice (ARMY per te, W(A) per gli altri). Tutti i calcoli eseguiti per la guerra hanno quell'indice come riferimento.
Ho introdotto "le spie" che scoprono (con un margine sul dato del +-10%) il numero di acri, la fertitlità del terreno e il numero di abitanti.
Solo il numero di abitanti è (indicativamente) utile per valutare la probabilità di vittoria in uno scontro (più alto è meglio è) e comunque l'esito di uno scontro ha una bella componente random.
Ad ogni modo più è altro questo indice più è "facile" che si vinca.

Perché la battaglia non sia allo sbaraglio come ora avrei pensato di visualizzare questo indice tra i dati delle spie dei vari manieri in concomitanza con il tuo.

Il problema è che non ho ancora trovato un termine adeguato al contesto storico. Non posso chiamarlo semplicemente "ARMATA" o "FORZA ESERCITO" visto che FORZA: 92 non significherebbe nulla in un "contesto medievale reale". Devo anche capire se è davvero meglio metterlo o meno, d'altra parte il tuo consigliere, prima di suonare il corno della battaglia, ti racconta più o meno lo stato d'animo del popolo e le sue sensazioni...

Una cosa del genere:

CODICE
Il rapporto delle nostre spie, Signore:                                        
                                                                                
1 ░░ provincia                                                                
2 ▒▒ Barone Tispiezzoindue    #### acri (#########) e ### abitanti (125)     <=== l'indice di forza    
3 ▓▓ provincia                                                                
4 ☼☼ Conte Vattelapesca       #### acri (#########) e ### abitanti  (***)     <===  se non scoperto dalle spie
5 ◘◘ Visconte Comesichiama    #### acri (#########) e ### abitanti  FORZA: 75         <=== oppure così        
                                                                                
Chi desidera invadere, Eccellenza (1-5, invio per annullare)?  Tua forza:92

Inviato da: Gwenelanil 8 Oct 2018, 09:03

Siamo felicissimi di annunciare che http://www.oldgamesitalia.net/notizie/giochiamo-maniero-italiano è stata completata blush.gif!

Inviato da: TheRuleril 23 Oct 2018, 16:24

http://www.oldgamesitalia.net/traduzioni/maniero-basic.
Migliorie cosmetiche varie d'obbbligo e risolto un raro bug originale segnalatomi dall'autore che non avevo gestito.
Era capitato in effetti una sola volta a Boselli:

CITAZIONE
- Poteva capitare che un Nobile già sconfitto (provincia) fosse interessato alla tua terra

Inoltre un bug coperto da spoiler. ;-)

Funfact: L'autore Leon Baradat mi ha chiesto di tradurre in inglese la mia versione per il suo sito. ;-)

CITAZIONE
I was never satisfied with the game's scoring system, so I'm glad you've made some improvements on it. I'll have a look, but I doubt I'll find much wrong with the changes you've made there.

Fixing taxes is probably a good thing; I don't recall how I did that, but it does seem all over the place; I've often wondered about that, but not enough to look into it. I think I must have done a straight random number with it--in which case, it sounds like your plan makes a lot more sense.

I see you've made quite a few improvements to the game. It may take some getting used to, but I think what you've done so far is very good.

Inviato da: selvenil 23 Oct 2018, 17:56

Grande rullo vai con la retro ri-traduzione credo che sia un primato anche per ogi ;P

Inviato da: frank_oneil 23 Oct 2018, 18:05

Se pure l'autore del gioco approva le tue modifiche e ti chiede di ritradurlo vuol dire che hai fatta davvero un buon lavoro. Complimenti!

Inviato da: selvenil 23 Oct 2018, 19:28

rullo la 2.03 mi da errore nella riga 247 se provo ad aprire le istruzioni

CITAZIONE
IF A$="I" OR A$="i" THEN CHAIN "MANIERO2.INT",, ALL

Inviato da: TheRuleril 23 Oct 2018, 19:36

Grazie, ragazzi!

Selven, i due file, MANIERO2.BAS e MANIERO2.INT devono essere nella stessa cartella.

Inviato da: selvenil 23 Oct 2018, 19:55

si ho letto, sono in c:\manor tutti e due più il leggimi per lanciare il gioco apro maniero2.bas con pcbasic

Inviato da: TheRuleril 23 Oct 2018, 20:06

Ah, ho capito, lo hai associato a PC-BASIC e lo apri con doppio click, giusto?
Allora devi metterli nella cartella di PC-BASIC.
A quel punto puoi aprirlo con doppio click oppure da dentro PC-BASIC con il comando: LOAD "MANIERO2"

Ho aggiornato il readme

Inviato da: selvenil 23 Oct 2018, 20:33

anche mettendolo nella cartella di pcbasic (c:\programmix86\pc-basic-1.2) fa uguale cmq windows 10 non me lo associa faccio tasto destri apri con

Inviato da: TheRuleril 23 Oct 2018, 21:28

Istruzioni per i tester:

1- Scarica e installa PC-BASIC, l'emulatore di GW BASIC da https://github.com/robhagemans/pcbasic/releases/download/v1.2.14/pcbasic-v1.2.14-win32.exe.

2 -Metti i due file maniero2.bas e maniero2.int nella cartella c:\programmi(x86)\pc-basic-1.2

3- avvia PC basic e scrivi:

LOAD "MANIERO2"
deve darti Ok
Poi scrivi:
RUN

Inviato da: selvenil 24 Oct 2018, 17:11

ho seguito le tue istruzioni, ma quando faccio il load mi da file not found

Inviato da: TheRuleril 24 Oct 2018, 18:36

Prima volta che mi capita. scratch.gif
Verifica che le proprietà del link di PC-BASIC abbiano il campo "Da:" popolato con "C:\Program Files (x86)\PC-BASIC-1.2"


per capire dove tu effettivamente sia prova a creare una directory da dentro PC-BASIC con il comando
MKDIR "CICCIO"
poi cerca la cartella "ciccio" sul tuo PC, così capiamo dove vuole i file PC-BASIC in windows 10.
Magari li mette nella cartella del file INI:
c:\Users\(nome utente)\AppData\Roaming\pcbasic-1.2\

Inviato da: selvenil 25 Oct 2018, 12:41

risolto era questo:

CITAZIONE
Verifica che le proprietà del link di PC-BASIC abbiano il campo "Da:" popolato con "C:\Program Files (x86)\PC-BASIC-1.2"

puntava a c:\user\(nomeutente) l'ho cambiato come hai detto e ora funziona

Inviato da: TheRuleril 25 Oct 2018, 15:27

Ottimo, aggiorno il LEGGIMI per includere anche questo caso.

Sto avendo un proficuo scambio con Leon Baradat che sta portando a diversi aggiustamenti sulla versione inglese, che sto ovviamente riportando anche su quella italiana. Non solo linguistici ma anche funzionali. Ha molte idee ed ora che il gioco è in inglese lo sta betatestando a fondo pure lui.
http://www.oldgamesitalia.net/traduzioni/maniero-basic

Inviato da: selvenil 25 Oct 2018, 17:00

per curiosità cosa cambia dalla 2.0.3 alla 2.0.8? il leggimi non è aggiornato in questo
inoltre vedo sul sito di baradat un manor intro, che cos'è si integra anche con la tua versione?
ho notato un bughettino avevo 1 mercenario e in battaglia ne sono morti 2 c'è un controllo che eviti di avere più morti delle truppe attuali?

Inviato da: TheRuleril 26 Oct 2018, 00:54

CITAZIONE (selven @ 25 Oct 2018, 18:00) *
per curiosità cosa cambia dalla 2.0.3 alla 2.0.8? il leggimi non è aggiornato in questo
inoltre vedo sul sito di baradat un manor intro, che cos'è si integra anche con la tua versione?

Come ho scritto aggiustamenti del testo sia come layout che come contenuti. Modifica di formule matematiche

Il file INTRO di Leon sono le istruzioni in inglese. Nel file Leggimi c'è scritto difatti che il file MANIERO.INT sono le istruzioni in italiano, espanse e integrate con la spiegazione delle nuove meccaniche.


CITAZIONE
ho notato un bughettino avevo 1 mercenario e in battaglia ne sono morti 2 c'è un controllo che eviti di avere più morti delle truppe attuali?

in realtà sarebbe un bug originale che DOVREI aver corretto. L'ho pure segnato nel LEGGIMI...
CITAZIONE
- Corretto il calcolo delle perdite in battaglia (in originale poteva capitare morissero ad esempio 8 nobili di 0).

Verifico ancora.

Inviato da: selvenil 26 Oct 2018, 09:50

allora mi è saltato fuori un codice di errore 8 751
in pratica mi chiede di seminare, ma sono in negativo perchè non ho potuto pagare il re e non posso dirgli di non seminare niente mi torna alla richiesta sia che confermi con s sia che dica n

Inviato da: TheRuleril 26 Oct 2018, 10:57

Era una regressione. Ho messo online la 2.09

Inviato da: selvenil 26 Oct 2018, 12:17

Allora dopo alcune partite ho rilevato alcune "storture" nel gioco

1) il sistema di tassazione dopo il raccolto prima mi dice che i contadini i nobili ecc hanno bisogno di grano e io devo darglielo dalle mie scorte limitate (rischiando di non farcela) e poi quegli stessi soggetti nel turno immediatamente successivo mi riempiono di grano delle tasse, la cosa non ha senso se sto raccogliendo le tasse dovrei avere a disposizione da subito quel grano in modo da poter decidere cosa farne

2) non posso vendere il grano, spesso e volentieri quando pago le tasse al re mi fa fuori tutti i fiorini tant'è che poi non mi rimangono soldi per magazzinieri e spie, anche se ho più di 10000 moggi di grano che stanno li ad andare in vacca per le calamità, sarebbe carino che prima o dopo che ti chiede di vendere i terreni ti chiedesse se vuoi vendere anche grano (magari con un tasso di 5:1 un pelo favorevole rispetto al 6:1 del re che li pretende al posto dei fiorini che non hai), sempre nello stesso contesto sarebbe bello anche solo poter pagare il re completamente in grano o fiorini.

3) il morale delle truppe influenza troppo l'esito degli scontri anche con milizie pari al doppio di quelle avversarie mi capita di perdere perchè nel 90% dei casi le truppe hanno il morale basso, ora magari ho saltato un passaggio io nelle istruzioni che ho letto di fretta ma non capisco come funzioni il computo del morale

4) anche se ho grano a disposizione mi capita che qualche categoria di popolo rischi la fame senza chiedermi i moggi, non so se questo sia considerabile un bug

5) non posso donare grano al popolo di mia iniziativa per incentivarne la crescita, nel video di leonardo boselli in un passaggio dice che è meglio dare al popolo più grano di quello che chiede perchè si riproducono meglio, ma mi trovo spesso in condizione in cui non me lo chiedono, ho poco popolo perchè mi sono morti nelle conquiste dei territori avversari e nessun modo per aumentare le mie forze

6) assumere i mercenari non conta, se anche assumo mercenari il mio indice di armata non cambia per nulla, magari quelli assunti nella prima campagna contano non posso saperli ma se per esempio dichiaro guerra, assumo mercenari e non attacco quando dichiaro guerra la volta successiva assumendo nuovi mercenari l'indice di armata rimane come prima

Spero che questi feedback possano tornarti utili

Inviato da: TheRuleril 26 Oct 2018, 16:51

Ciao Selven grazie per i feedback!
Alcune delle cose che hai chiesto sono coperte dalle istruzioni, ci hai dato un occhio?

1) E' una precisa meccanica voluta. Il periodo delle tasse è successivo a quello del raccolto proprio perché così è possibile calcolare l'ammontare dovuto al padrone del Maniero (il giocatore). Se leggi bene il testo della "fame" dice "al netto delle tasse". I vari gruppi sociali tengono da parte il dovuto per le tasse da consegnare mesi dopo, sta a te essere magnanimo (e lungimirante) elargire loro il grano per non fargli patire la fame o morire. Inoltre, ludicamente parlando, invertire le sezioni sarebbe troppo facile perché non avresti nessuna scelta cruciale da fare.

2) I fiorini sono una risorsa importante, non era così in originale, è una delle modifiche sostanziali alle meccaniche che ho apportato. Devi cercare di preservarla e stare attento a non scambiare MAI moggi per fiorini durante il pagamento delle tasse. Storicamente il grano veniva utilizzato principalmente come merce di scambio, raramente venduto in cambio di fiorini. La moneta corrispondente ai fiorini era lo scambio di favori tra nobili. Ergo i fiorini sono RARI e dunque hanno molto valore. Da qui il tasso di scambio più sconveniente se non hai moggi.
Pagare il Re solo i grano o fiorini non è storicamente aderente. Puoi farlo solo portando a zero una delle due risorse. Se riesci a sopperire con l'altra eviti il debito, altrimenti devi accollartelo. Avere debito con il Re vuole dire interessi sulle tasse dell'anno successivo.

3) Il morale è un altro elemento portante del gioco. Maniero 2.0 non è un wargame ma uno strategico manageriale, la parte militare ricopre una piccola fetta. L'indice di milizia tiene conto del morale, comunque. Anche avendo un morale alto non è garantita la vittoria, la componente casuale nei combattimenti è alta ma segue un preciso e complesso algoritmo che ha come variabili il numero di persone, il numero di persone in salute (ogni classe sociale ha un diverso e preciso valore di attacco o difesa militare), il loro morale, la quantità di terreno, la distribuzione del terreno, il numero di mercenari, gli esiti delle battaglie precedenti e il castello. Questo di entrambe le parti.
Se hai perso una battaglia puoi dare la colpa al caso ma potrebbe essere stato anche il tempismo. E' sempre meglio aspettare uno o due anni per migliorare il morale del tuo popolo, accumulare grano per pagare mercenari e sferrare l'attacco con almeno il doppio della forza militare.

4e5) Se una classe sociale non ti chiede moggi vuol dire che non ne ha bisogno. Al massimo compare "sono malnutriti" se hai esagerato troppo con la tassazione ma generalmente non muore nessuno (a parte una piccola componente casuale che li fa malnutrire e fa diminuire quindi solo quelli in salute). Se ad esempio fossero a corto di 500 moggi e tu dessi loro 100 moggi è probabile che qualcuno muoia per fame. Se dessi 500 si sfamerebbero tutti, se dessi 600 non cambierebbe nulla perché il popolo non ha magazzini e dunque il grano andrebbe sprecato. Anche Leonardo non lo sapeva. L'unico modo per incentivare la crescita di Contadini e nobili è tassarli MENO del 10%. Per far crescere i servi è farli lavorare meno. I servi non sono tassati, il loro obolo è il lavoro nei tuoi campi.

6) In effetti l'indice non si aggiorna in caso di battaglia annullata. Ma deve essere un problema solo di visualizzazione dell'indice perché la formula è corretta. EDIT: ho verificato e c'è l'errore! Grazie Selven! Pulendo e spostando il codice avevo invertito delle linee senza rendermi conto che l'indice milizia (ARMY) veniva calcolato DOPO la modifica dovuta ai mercenari, di fatto sovrascrivendo il valore giusto. L'errore c'era solo quando si dichiarava guerra, mentre era ok in caso di attacco subito.
La filosofia dietro ai mercenari è che incidono sulla forza militare meno dei nobili ma sono fondamentali in battaglia. L'indice cambia sempre e come ho scritto tiene conto di diversi fattori. I mercenari sono ingaggiati per "20 moggi all'anno", questo vuol dire che una volta assunti rimangono a combattere per te solo quell'anno e finite le tre campagne non fanno più parte della milizia. L'anno successivo devi ingaggiarne di nuovi.
I mercenari ingaggiati nella prima campagna che rimangono in vita combatteranno nella seconda e si andranno a sommare aglie evntuali nuovi ingaggi, stesso vale per la terza.
Se hai avuto la percezione che l'indice non variasse è perché esso varia anche in base al morale e al numero di combattenti. L'indice si abbassa se muoiono combattenti o se perdi una battaglia. Si alza se acquisisci mercenari o vinci una battaglia.

Inviato da: selvenil 27 Oct 2018, 08:04

sei riuscito a risolvere il punto 6?
Prima in una partita con una milizia di 99 contro una di 9 ho perso e sono stato invaso, ora capisco che il morale sia importante ma qui siamo sul ridicolo!
EDIT: ti confermo il bug sulle unità morte mi è capitato di nuovo coi mercenari che ne morissero 7 su 1 che avevo

Inviato da: TheRuleril 27 Oct 2018, 16:43

http://www.oldgamesitalia.net/traduzioni/maniero-basic
Ho rimosso l'indicazione della propria forza militare. L'umanità non è ancora pronta per accettare consapevolmente la casualità. ;-)
Il calcolo è complesso, selven. Non puoi sapere quanto TUTTE le variabili possano incidere sull'esito, non è un gioco di scacchi.
La risultante di tutte le variabili sono DUE indici, uno per parte. POI c'è il parametro CHANCE di vittoria, ovviamente legato ai due indici. Più alto è il tuo indice, più basso è il parametro CHANCE (CHA).
Se tu avevi un indice di 99 e l'altro di 9, è molto probabile che le tue chance di vittoria fossero intorno al 20%. su 1d100 devi aver tirato meno di 20. Crudele ma semplice. Magari non storicamente corretto, ma dal punto di vista ludico sì.

Ho modificato anche il dato milizia avversaria (sempre +o- 10%) nel numero di coscritti.
Sto rivedendo anche tutti i calcoli dell'assedio e degli attacchi fra 2 manieri diversi.

Inviato da: selvenil 27 Oct 2018, 17:01

la lamentela non è che ho perso ci può anche stare però è incredibile che mentre lo attacco io, con un rapporto di forza di 11 a 1 lui mi conquista!
in ogni caso un 20% di perdere con un simile rapporto di forza è esagerato è 1/5, così il gioco non è strategico nè storicamente accurato (cose che indicavi come ricercate nelle tue risposte precedenti), ma puramente basato sul culo!
cmq nella nuova versione ho riscontrato un nuovo baco, quando mi invadono non azzera la pagina, ma scrive sopra alla precedente, nella versione vecchia mi sembra che andasse bene, quindi probabilmente l'hai introdotto con questa

Inviato da: frank_oneil 28 Oct 2018, 04:40

Il fatto di non avere mai il 100% di probabilità di vincere è ciò che rende divertenti questi giochi, soprattutto considerando che ci sono molte variabili in gioco. Forse effettivamente avere un 20% di probabilità di sconfitta in uno scontro 99 contro 9 è un po' strano, 15% o 10% mi sembrerebbe più sensato, ma rimane comunque una scelta legata allo stile di gioco che si vuole imporre, è anche questo game design. Il realismo non è sempre la scelta migliore.
Io a TheRuler consiglierei solo questo stratagemma: quando viene attivato un evento molto raro, cerca di sottolinearlo in modo da far capire al giocatore che la situazione che si è venuta a creare è particolare. Questo spingerà il giocatore ad accettare la situazione con divertimento e non penserà che il gioco è fatto male.

Esempio:
A) Il mio esercito di 99 uomini viene sconfitto da un misero gruppo di 9 soldati. Il giocatore non capisce come sia possibile. Il gioco è ingiusto, è tutta una questione di sedere.
B) Il mio esercito di 99 uomini viene sconfitto da un misero gruppo di 9 soldati. A video compare una scritta del tipo "È successo l'impensabile! Nonostante la SMISURATA superiorità numerica del tu esercito il nemico ha avuto la meglio! Sembrava una passeggiata, ma il nemico ha dimostrato un RARO coraggio e ti ha sopraffatto". Il giocatore se la prende, ma capisce che l'imprevedibilità fa parte del gioco. Si diverte, ci proverà ancora.

Inviato da: TheRuleril 28 Oct 2018, 16:08

Il 20% era indicativo. Ho provato a simulare una battaglia con 99 vs 9. Senza sapere il morale e la composizione degli eserciti (la forza è, a scalare, nobili, mercenari, contadini, servi) ho stabilito un range verosimile che va dal 8 al 25%.

Capisco quello che vuoi dire selven e frank_one ha proposto un'ottima soluzione al problema. Grazie a tutti e due per i suggerimenti!
Fissandosi sulle formule e sulla meccanica spesso si tende a tralasciare la forma.
Ho reso più "parlante" il consiglio dei nobili pre battaglia. Daranno indicazioni sul probabile esito basato sui dati delle spie e sul loro morale e sui partecipanti alla battaglia.
E se la sconfitta o la vittoria sarà "eccezionale", un testo aiuterà ad accettare l'esito. ;-)

http://www.oldgamesitalia.net/traduzioni/maniero-basic

Inviato da: selvenil 28 Oct 2018, 16:30

Hai sistemato anche il baco che non cancella la pagina quando ti invadono?

Inviato da: TheRuleril 28 Oct 2018, 19:09

Sì.

Inviato da: selvenil 28 Oct 2018, 20:07

sono stato avvelenato dai miei nobili, il calice rovesciato è una figata galattica!
domandone stupidone aggiungere un'asci art di un castello nella pagina iniziale ti sballerebbe qualcosa?
non puoi avere delle immagini così fighe in end game e nulla all'inizio!
dunque a sto giro son morto di peste ho notato che dice i morto anzichè sei morto, non so da cosa dipenda (ps una bella immagine della maschera del medico o di un sorci per la morte da peste?
(so che sono un cagacazzo ma le ascci art sono troppo fighe)

Inviato da: TheRuleril 28 Oct 2018, 22:24

Il problema sono i 60KB di memoria limite gestita dal GWBasic.
Le 5 ascii art le ho fatte io, un paio prendendo spunto da disegni trovati in rete ma adattati alle mie esigenze. L'interlinea diverso modifica l'effetto finale, quindi va monipolata un minimo.

Di castelli ce ne sono a bizzeffe liberamente scaricabili e considerato che non si tratta di un gioco commerciale non sarebbe un problema aggiungere ascii art, ma vorrei restasse un gioco prevalentemente testuale. Ho messo quelle come finale per dare una sorta di "premio".

http://loveascii.com/castles.html
https://www.asciiart.eu/buildings-and-places/castles
https://asciiart.website/index.php?art=objects/castles

CODICE
                                 o
                             .-""|
                             |-""|
                                 |   ._--+.
                                .|-""      '.
                               +:'           '.
                               | '.        _.-'|
                               |   +    .-"   J
            _.+        .....'.'|    '.-"      |
       _.-""   '.   ..'88888888|     +       J''..
    +:"          '.'88888888888;-+.  |    _+.|8888:
    | \         _.-+888888888_." _.F F +:'   '.8888'....
     L \   _.-""   |8888_.-"  _." J J J  '.    +88888888:
     |  '+"        |_.-"  _.-"    | | |    +    '.888888'._''.
   .'8L  L         J  _.-"        | | |     '.    '.88_.-"    '.
  :888|  |         J-"            F F F       '.  _.-"          '.
:88888L  L     _+  L            J J J          '|.               ';
:888888J  |  +-"  \ L          _.+.|.+.          F '.          _.-" F
:8888888|  L L\    \|      _.-"    '   '.       J    '.     .-"    |
:8888888.L | | \    ', _.-"              '.     |      "..-"      J'.
:888888: |  L L '.    \     _.-+.          '.   :+-.     |        F88'.
:888888:  L | |   \;.-""     '.          :-"    ":+ J        |88888:
:888888:  |  L L   +:""            '.    _.-"     .-" | |       J:888888:
:888888:   L | |   J \               '.-'     _.-'   J J        F :888888:
:88888:    \ L L   L \             _.-+  _.-'       | |       |   :888888:
:888888:    \| |   |  '.       _.-"   |-"          J J       J     :888888:
:888888'.    +'\   J    \  _.-"       F    ,-T"\  | |     .-'      :888888:
  :888888 '.     \   L    +"          J    /  | J  J J  .-'        .'888888:
   :8888888 :     \  |    |           |    F  '.|.-'+|-'         .' 8888888:
    :8888888 :     \ J    |           F   J     '...           .' 888888888:
     :8888888 :     \ L   |          J    |      \88'.''.''''.' 8888888888:
      :8888888 :     \|   |          |  .-'\      \8888888888888888888888:
       :8888888 '.    J   |          F-'  .'\      \8888888888888888888.'
        :88888888 :    L  |         J     : 8\      \8888888888888888.'
         :88888888 :   |  |        .+  ...' 88\      \8888888888.''.'
          :88888888 :  J  |     .-'  .'    8888\      \'.'''.'.'
           :88888888 :  \ |  .-'   .' 888888888.\    _-'
           :888888888 :  \|-'     .' 888888888.' \_-"
            '.88888888'..         : 8888888.'
              :88888888  ''''.''.' 88888888:  hs
              :8888888888888888888888888888:
               :88888888888888888888888888:
                :888888888888888888888888:
                 ''.8888888888888...'.'''
                    '''''......''


Per dire, in 10 minuti ho adattato questo. Non sarebbe male in basso a dx nella schermata del menu.

CODICE

_   |~  _
[_]--'--[_]
|'|""`""|'|
| | /^\ | |
|_|_|I|_|_|



        |~     |~     |~
        [U]   /H\   [U]
        |#|U'U'U'U'U|#|
        | | ' .°. ' | |
        |_|___|H|___|_|
    ^^^^^^^^^^^^^^^^^^^^^^^

        |~       |~       |~
        [U]     /H\     [U]
        |#|U'U'U'U'U'U'U|#|
        | | ' ' ,', ' ' | |
        |_|_____|H|_____|_|
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Inviato da: selvenil 29 Oct 2018, 00:10

quello grande è il più figo, ma poi sarebbe un casino rifare tutta la pagina, tra quelli piccoli forse meglio il secondo

Inviato da: TheRuleril 30 Oct 2018, 00:26

CITAZIONE (selven @ 29 Oct 2018, 01:10) *
quello grande è il più figo, ma poi sarebbe un casino rifare tutta la pagina, tra quelli piccoli forse meglio il secondo

Satsera ero particolarmente ispirato; ho ritoccato il calice e il castello. Corretto inoltre un piccolo refuso sulla distribuzione delle terre: se gli acri erano a meno di zero non ti chiedeva di ridistribuire.
2.12 online.

Inviato da: selvenil 30 Oct 2018, 18:10

BEDDISSSIMO, ma visto che sono cagazzi e senza vergogna pure che ne pensi di colorare il portone di marrone e le finestre di azzurro?

Inviato da: TheRuleril 30 Oct 2018, 20:39

Avevo colorato anche il prato verde e tutto il castello marrone, ma ho visto che troppi colori stonano. Meglio pochi e che si abbinino fra di loro.

Inviato da: selvenil 30 Oct 2018, 20:49

uhm io proverei col prato giallo per ricordare il grano, il corpo del castello lo lasci grigio e colori solo il portone di marrone e le finestre di azzurro

Inviato da: TheRuleril 4 Nov 2018, 12:45

http://www.oldgamesitalia.net/traduzioni/maniero-basic

Per gli amanti delle tabelle (quale io sono) e dietro suggerimento di Leon Baradat, ho modifiacto la sezione "fame e raccolto" in una più comoda e leggibile tabella riepilogativa.
Il vantaggio strategico più grande è che ora è possibile vedere SUBITO tutte le necessità di tutti i gruppi sociali e decidere meglio quanti e a chi elargire il grano.

A confronto, vecchio layout e nuovo.

 

Inviato da: selvenil 4 Nov 2018, 13:12

bug al volo non riesco a comprare i terreni

Inviato da: TheRuleril 4 Nov 2018, 14:13

CITAZIONE (selven @ 4 Nov 2018, 13:12) *
bug al volo non riesco a comprare i terreni

A me funziona. Che errore ti dà?
Se intendi che non ti da la possibilità potrebbe essere corretto. Non puoi comperarli sempre, devi attendere l'offerta degli altri manieri.
Puoi invece decidere di vendere sempre, a patto di avere più di 0 acri nei tuoi possedimenti.

Inviato da: selvenil 4 Nov 2018, 14:15

mi da la possibilità, ma quando vado alla mappa e li seleziono non me li assegna

Inviato da: TheRuleril 4 Nov 2018, 19:25

CITAZIONE (selven @ 4 Nov 2018, 14:15) *
mi da la possibilità, ma quando vado alla mappa e li seleziono non me li assegna

Se il numero di acri è inferiore a 7 è voluto. Sulla mappa ogni cubetto equivale a 12 acri.
Ad ogni modo valori tra 1 e 6 te li sottrae o aggiunge comunque al totale degli acri posseduti.
Ho aggiunto BL<7 alla condizione per evitare di mostrare la mappa se non ci sono state modifiche.
Inoltre ho corretto qualche typo qua e la e aggiunto due righe di testo descrittive.

http://www.oldgamesitalia.net/traduzioni/maniero-basic
Fammi sapere, grazie selven.

Inviato da: selvenil 4 Nov 2018, 22:34

No gli Acri erano più di sette, fra l'altro non me lo faceva con la versione precedente, appena posso lo riprovo

Inviato da: TheRuleril 6 Nov 2018, 01:32

http://www.oldgamesitalia.net/traduzioni/maniero-basic
Le novità più importanti di questa release:

- Il morale delle varie classi ora viene modificato anche dalle tasse del Re, dalla percentuale di acri lavorati da parte dei servi o quando si decide la sorte del feudatario sconfitto
- Ora è possibile salvare le proprie GESTA in un file che contiene tutti i turni di gioco, ripercorribili ad uno ad uno seguendo il mutamento della mappa e delle statistiche

CORRETE SUBITO A SCARICARLA. Se non lo fate, che peste vi colga!


Inviato da: selvenil 6 Nov 2018, 18:53

Allora ho provato la nuova versione e ti segnalo un bug sulle gesta (che sono una figata), partono dall'anno 1 e non dall'anno 0 (nel senso che la prima schermata secondo me dovrebbe mostrare la situazione iniziale del gioco e non quella dopo il 1° anno)
Fra l'altro sarebbe carino avere la possibilità di vedere il replay dopo la partita.
nel leggimi è rimasto questo, ma dovresti averlo eliminato se non sbaglio:

CITAZIONE
- Aggiunto il dato relativo alla forza militare (milizia). Un indice alto non significa vittoria assicurata, esiste sempre una componente casuale legata al morale di entrambi gli eserciti

A questo punto come modifica finale io aggiungerei una grafica finale per le morti che non la contemplano (se ci stai dentro)

Inviato da: frank_oneil 6 Nov 2018, 19:24

L'idea di salvare le varie fasi della partita è OTTIMA. Sulla questione tabelle/stringhe di testo: preferisco le stringhe di testo. Ricordati che è un gioco, non un resoconto dal reparto contabilità. Le tabelle sono così fredde... Il gioco deve avere sempre un gusto narrativo, devi far credere al giocatore che ci sia un'anima dietro a quei numeri. Se glieli sbatti in faccia ben incolonnati perdi l'effetto magia.

Inviato da: TheRuleril 7 Nov 2018, 00:11

CITAZIONE (frank_one @ 6 Nov 2018, 19:24) *
L'idea di salvare le varie fasi della partita è OTTIMA. Sulla questione tabelle/stringhe di testo: preferisco le stringhe di testo. Ricordati che è un gioco, non un resoconto dal reparto contabilità. Le tabelle sono così fredde... Il gioco deve avere sempre un gusto narrativo, devi far credere al giocatore che ci sia un'anima dietro a quei numeri. Se glieli sbatti in faccia ben incolonnati perdi l'effetto magia.

Capisco cosa dici e sono d'accordo, ma in quella particolare fase, vedere 3 righe e poi tre testi che si susseguono, che danno la stessa informazione per tre gruppi diversi l'ho trovato motlo ridondante e quello sì che spezza la sospensione dell'incredulità.
Piuttosto uno schema, presentato dal tuo consigliere come un "rapporto annuale", lo trovo molto tematico.
Trovo più veritiera una situazione in cui il consigliere ti consegna un registro con scritte tutte le informazioni segnate nel corso dell'anno piuttosto che una persona che mi entra in sala dicendo "ai 60 contadini manca questo, e questo, noi abbiamo questo, quanto diamo?" 300 moggi, VAI.
Va a dare i moggi, torna e mi fa la stessa solfa, oltre tutto snocciolando dati precisi a memoria, altre due volte per i servi e i nobili... ;-)
Ok dai, mi piace molto la tabella, si nota troppo?


Selven, grazie per il leggimi, correggo subito. Per quanto riguarda l'anno 0 basta avviare una qualunque partita per sapere lo stato iniziale. E' sempre uguale per tutte le partite. Ad ogni modo la situazione non è quella dopo il primo anno, è quella DEL primo anno visto che tutto quello che è successo lo salvo come ultima cosa proprio prima di iniziare il nuovo anno.

Grazie mille per le GESTA, sono molto soddisfatto e non è stato facile trovare un modo elegante per buttare giù il codice. All'inizio avevo deciso di salvare ogni anno appendendo il nuovo salvataggio alla fine del precedente (fino alla versione 2.15 lo sovrascrivevo), il problema era che con l'aumentare dei turni aumentava anche lo spazio occupato dal savegame, non necessariamente un problema ma il tempo di caricamento aumentava in maniera lineare. Ho dunque deciso di salvare due file paralleli, uno temporaneo con il vecchio metodo (salvando solo l'ultimo turno) e l'altro con il nuovo (salvando ogni turno appendendo in sequenza).
fun fact: Per come ho progettato le GESTA, volendo, sarebbe possibile ripartire a giocare da un turno qualunque. Un CHEAT enorme. ;-)

Inviato da: selvenil 7 Nov 2018, 00:16

lo so che basta avviare la partita e vedi la situazione iniziale, ma quando carichi le gesta non la vedi e quindi manca una schermata, per come è fatto ora è incompleto
ps con la 2.16 non ho più il problema nell'acquisto dei terreni

Inviato da: TheRuleril 7 Nov 2018, 00:27

Non direi che è incompleto. E' il turno 1, non vedo altro modo per rappresentare una sequenza di eventi. Il turno 0 è nell'intro.

Inviato da: selvenil 7 Nov 2018, 00:32

si ma è una sequela di eventi e parti da una situazione modificata senza mostrare l'inizio, inoltre già che ne parliamo sarebbe figo poter andare avanti e indietro anzichè solo avanti, se possibile

Inviato da: TheRuleril 9 Nov 2018, 19:38

Purtroppo non è possibile tornare indietro per come ho concepito la lettura sequenziale del file. Non è come l'avanti/indietro dell'intro (che sono dei semplici GOTO) Il file delle gesta occupa 7KB per ogni turno, se dovessi cercare la variabile del turno ogni volta, il tempo di ricerca potrebbe essere tollerabile i primi 3-4 turni ma poi diventerebbe insostenibilmente lungo. Ho fatto una prova, per caricare 30 turni ci voglio 20 secondi.
Ad ogni modo ho aggiunto l'anno zero. Ma non so quanto sia interessante come informazione vedere dei numeri interi, 250 fiorini, 1200 moggi ecc... "veda un po' lei"

Ho cambiato anche la gestione dei file.

http://www.oldgamesitalia.net/traduzioni/maniero-basic
I vecchi slavataggi non funzioneranno.

Inviato da: frank_oneil 9 Nov 2018, 21:33

CITAZIONE (TheRuler @ 7 Nov 2018, 00:11) *
Per come ho progettato le GESTA, volendo, sarebbe possibile ripartire a giocare da un turno qualunque. Un CHEAT enorme. ;-)
Sarebbe una bella feature! Il giocatore potrebbe così riparare a qualche errore, anche se... se i turni si basano su numeri casuali ogni volta sempre diversi, forse rigiocare un turno e scoprire che le cose non avvengono come nella partita precedente potrebbe creare un po' di confusione.

Inviato da: DKil 10 Nov 2018, 09:00

Rullo, ma visto che ormai lo conosci come le tue tasche questo gioco, hai mai pensato di riscriverlo in qualche linguaggio più flessibile del gwbasic? (o invece stai provando a spremerlo? biggrin2a.gif)
Magari anche qualcosa giocabile via browser visto che non richiede chissà che grafica.

Inviato da: TheRuleril 10 Nov 2018, 12:08

CITAZIONE (DK @ 10 Nov 2018, 09:00) *
Rullo, ma visto che ormai lo conosci come le tue tasche questo gioco, hai mai pensato di riscriverlo in qualche linguaggio più flessibile del gwbasic? (o invece stai provando a spremerlo? biggrin2a.gif)
Magari anche qualcosa giocabile via browser visto che non richiede chissà che grafica.

Mi sto proprio divertendo a vedere dove posso spingermi. Al momento ho ancora BEN 4899 Bytes da usare, quindi un monte di spazio. ;-)
Ad ogni modo l'idea di farlo via browser ce l'ho da tempo, si presta parecchio e gli altri come santa paravia o hammurabi hanno già la loro versione. Sto anche studiando con Leon Baradat una versione app per android.

Inviato da: selvenil 10 Nov 2018, 12:39

ASCII ART, ASCIII ART, ASCIIIIIIIIIII ART!

Inviato da: TheRuleril 10 Nov 2018, 18:52

CITAZIONE (selven @ 10 Nov 2018, 12:39) *
ASCII ART, ASCIII ART, ASCIIIIIIIIIII ART!


ghgh.gif

Inviato da: selvenil 11 Nov 2018, 13:58

sai che questo mi dà ragione vero?

Inviato da: TheRuleril 15 Nov 2018, 02:52

Ultima fatica.

- Modificata la sezione "distribuzione delle terre" in una più comoda tabella riepilogativa che presenta tutti i dati in un'unica soluzione (con l'aggiunta della fertilità e del morale attuale e previsto) per una miglior gestione delle elargizioni di terreno
- Adesso il morale delle classi sociali varierà coerentemente con il variare della terra elargita




http://www.oldgamesitalia.net/traduzioni/maniero-basic, per un pochino ho idea che lascerò riposare il codice, magari per dedicarmi alla versione browser o android.
Sono arrivato al punto di aver raddoppiato sia le linee di codice che le dimensioni del programma. Ho 2061 Bytes liberi a programma in corso (ovvero considerando lo spazio per le variabili e gli array) che mi vorrei tenere per eventuali (improbabili) aggiunte al codice.


CODE
ORIGINALE 2.18:

2230 CLS:DIS=0:COLOR 3:?:?"Distribuzione delle terre nel tuo maniero:":FOR A=1 TO 3:LX(A)=L(A):NEXT:LX=LE:GOSUB 2334:LOCATE 12,1
2240 IF LE<0 THEN COLOR 14:?:?"Abbiamo perduto"ABS(LE)"acri di terra, mio Signore. Ridistribuisca con saggezza!":GOTO 2280
2245 IF LE>0 THEN GOSUB 38:COLOR 3:? "di"L"acri possiedi"TAB(22)LE"di terra";:COLOR BS(XT):? TAB(37)L$(XT)
2250 ?:IF LE<=0 THEN COLOR 14:?"Non abbiamo terra per la semina dell'anno prossimo, sua Eccellenza!"
2255 IF G<LE THEN COLOR 14:?"Non abbiamo il grano per la semina dell'anno prossimo, mio Signore!"
2260 IF G<LE/2 AND G>0 THEN COLOR 14:?"Purtroppo abbiamo grano sufficiente a coltivare solo"INT(G)"acri, mio Signore."
2270 COLOR 14:?"Desidera ridistribuire le terre (s/n)?":?F(1)F(2)F(3)F MO(1)MO(2)MO(3);:COLOR 3:A$=INPUT$(1):IF A$<>"S" AND A$<>"s" THEN 2321
2280 DIS=1:COLOR 3:LOCATE 17,1:?" Terra per i contadini ("L"acri massimi ) ";:INPUT L5(1):IF L5(1)>L THEN 2280 ELSE L(1)=L5(1)
2290 LOCATE 18,1:?" Terra per i servi ("L-L(1)"acri massimi ) ";:INPUT L5(2):IF L5(2)>L-L(1) THEN 2290 ELSE L(2)=L5(2)
2300 LOCATE 19,1:?" Terra per i nobili ("L-L(1)-L(2)"acri massimi ) ";:INPUT L5(3):IF L5(3)>L-L(1)-L(2) THEN 2300 ELSE L(3)=L5(3)
2320 CLS:?:?"Questa sarà la ripartizione delle terre per il prossimo anno:":LEE=LE:LE=L-L(1)-L(2)-L(3):GOSUB 2334:GOTO 2240
2321 IF DIS=0 THEN 2330 ELSE FOR A=1 TO 3:IF L(A)<LX(A) OR L(A)>LX(A) THEN MO(A)=MO(A)*(L(A)/LX(A))
2322 NEXT
2324 IF L(1)>LX(1) THEN F(1)frown.gifF(1)*L(1)+(F(2)+F(3)+F)/3*(L(2)+L(3)+LE))/L
2325 IF L(2)>LX(2) THEN F(2)frown.gifF(2)*L(2)+(F(1)+F(3)+F)/3*(L(1)+L(3)+LE))/L
2326 IF L(3)>LX(3) THEN F(3)frown.gifF(3)*L(3)+(F(1)+F(2)+F)/3*(L(1)+L(2)+LE))/L
2327 IF LE>LX THEN F=(F*LEE+(F(1)+F(2)+F(3))/3*(L(1)+L(2)+L(3)))/L
2330 ?:?F(1)F(2)F(3)F MO(1)MO(2)MO(3):GOSUB 36:GOSUB 61:CLS:GOSUB 6000:?:GOTO 250
2334 COLOR 15:?:?"Classe n° Campi Acri capite Fertilità Morale Previsione"
2335 FOR A=1 TO 3:MOF(A)=MO(A):GOSUB 93:COLOR 3:?P$(A)TAB(11)P(A)TAB(16)INT(EP(A))TAB(22)L(A);:?TAB(28)USING " ##.#";L(A)/P(A);:COLOR BS(XF):? TAB(37)L$(XF);
2336 LOCATE 8+A,48:IF MO(A)>1.15 THEN COLOR 2:?"felici" ELSE IF MO(A)<.85 THEN COLOR 4:?"scontenti" ELSE COLOR 7:?"pacifici"
2337 IF L(A)<LX(A) OR L(A)>LX(A) THEN MOF(A)=MOF(A)*(L(A)/LX(A))
2338 LOCATE 8+A,59:IF MOF(A)>1.15 THEN COLOR 2:?"felici" ELSE IF MOF(A)<.85 THEN COLOR 4:?"scontenti" ELSE COLOR 7:?"pacifici"
2339 NEXT:RETURN


MODIFICATO 2.19:

2230 CLS:DIS=0:COLOR 3:?:?"Distribuzione delle terre nel tuo maniero:":GOSUB 36:FOR A=1 TO 3:LX(A)=L(A):NEXT:LX=LE:GOSUB 2334
2240 IF LE=>0 THEN GOSUB 38:COLOR 3:? "di"L"acri possiedi"TAB(22)LE"di terra";:COLOR BS(XT):? TAB(37)L$(XT)
2245 YD=14:DA=1:GOSUB 8080:YD=15:DA=1:GOSUB 8080:YD=16:DA=1:GOSUB 8080:LOCATE 14,1
2246 IF LE<0 THEN COLOR 14:?:?"Abbiamo perduto"ABS(LE)"acri di terra, mio Signore. Ridistribuisca con saggezza!":GOTO 2280
2250 IF LE<=0 THEN COLOR 14:?"Non avremo la terra per la semina dell'anno prossimo, sua Eccellenza!"
2255 IF G<LE AND G>0 THEN COLOR 14:?"Il grano che abbiamo sarà sufficiente a coltivare solo"INT(G)"acri, mio Signore."
2260 IF G<=0 THEN COLOR 14:?"Non abbiamo il grano per la semina dell'anno prossimo, mio Signore!"
2270 COLOR 14:?:?"Desidera ridistribuire le terre (s/n)?";:COLOR 3:A$=INPUT$(1):IF A$<>"S" AND A$<>"s" THEN 2305
2280 DIS=1:COLOR 3:FOR A=1 TO 3
2285 LOCATE 8+A,59:?" "TAB(65)L6"max ":LOCATE 8+A,59:INPUT "",L5(A):IF L5(A)>L6 OR L5(A)<0 THEN 2285
2290 L(A)=L5(A):L6=L6-L5(A):IF L(A)<LX(A) OR L(A)>LX(A) THEN MOF(A)=MOF(A)*(L(A)/LX(A))
2295 LOCATE 8+A,66:IF MOF(A)>1.15 THEN COLOR 2:?"felici " ELSE IF MOF(A)<.85 THEN COLOR 4:?"scontenti " ELSE COLOR 7:?"pacifici "
2300 COLOR 3:NEXT:LE=L-L(1)-L(2)-L(3):GOSUB 2334:GOTO 2240
2305 IF DIS=0 THEN 2330 ELSE FOR A=1 TO 3:IF L(A)<LX(A) OR L(A)>LX(A) THEN MO(A)=MO(A)*(L(A)/LX(A))
2306 NEXT
2310 IF L(1)>LX(1) THEN F(1)frown.gifF(1)*L(1)+(F(2)+F(3)+F)/3*(L(2)+L(3)+LE))/L
2315 IF L(2)>LX(2) THEN F(2)frown.gifF(2)*L(2)+(F(1)+F(3)+F)/3*(L(1)+L(3)+LE))/L
2320 IF L(3)>LX(3) THEN F(3)frown.gifF(3)*L(3)+(F(1)+F(2)+F)/3*(L(1)+L(2)+LE))/L
2325 IF LE>LX THEN F=(F*LE+(F(1)+F(2)+F(3))/3*(L(1)+L(2)+L(3)))/L
2330 GOSUB 36:CLS:GOSUB 6000:?:GOTO 250
2334 L6=L:LOCATE 7,1:COLOR 15:?:?"Classe n° Orti Acri capite Fertilità Morale Nuova Previsione"
2335 FOR A=1 TO 3:MOF(A)=MO(A):GOSUB 93:COLOR 3:?P$(A)TAB(11)P(A)TAB(16)INT(EP(A))TAB(22)L(A);:?TAB(28)USING " ##.#";L(A)/P(A);:COLOR BS(XF):? TAB(37)L$(XF);
2336 LOCATE 8+A,48:IF MO(A)>1.15 THEN COLOR 2:?"felici" ELSE IF MO(A)<.85 THEN COLOR 4:?"scontenti" ELSE COLOR 7:?"pacifici"
2337 NEXT:RETURN

Inviato da: TheRuleril 18 Nov 2018, 21:03

...eeeeee, ovviamente portare il codice su un altra piattaforma fa scoprire che alcune parti possono essere ottimizzate, soprattutto le magagne. ;-)
http://www.oldgamesitalia.net/traduzioni/maniero-basic.


CITAZIONE
- Corretta la condizione che limita la fertilità ad un intervallo di 0-70 onde evitare i rari casi di "illegal function call" essendo le variabili e gli array F,F(A) e FF(A) utilizzati all'interno di funzioni stringa

Inviato da: TheRuleril 29 Dec 2018, 03:04

http://www.oldgamesitalia.net/traduzioni/maniero-basic

CITAZIONE
Corretto allineamento nella distribuzione delle terre in caso di numero contadini maggiore di 99.

Con l'occasione della pubblicazione della mia http://peyre.x10.mx/GWBASIC/index.htm#Manor, decreto il progetto concluso.
Segnalo inoltre l'uscita della https://robhagemans.github.io/pcbasic/download.html!

Grazie a tutti per il supporto e i suggerimenti.
Il thread rimarrà ovviamente aperto per i dibattiti storici e (auspicabilmente no) segnalazione di bug. ;-)

Inviato da: TheRuleril 3 Aug 2021, 18:09

Segnalo l'uscita della https://github.com/robhagemans/pcbasic/releases.

Con l'occasione ho giffato una mia recente QUASI vittoria. E' stata una bella partita densa di accadiemnti e soprattutto SNEZA bug. Le funzioni di controllo dei calcoli hanno retto.

Ho scritto QUASI perché il vero finale lo si raggiunge sconfiggendo il Re e facendo passare un anno. Il problema è che l'anno esatto in cui ho sconfitto incredibilmente il Re sono morto di vecchiaia a 59 anni! AAAAAARGH!

clicca sulla gif sottostante per far partire l'animazione:


Purtroppo mancano all'appello circa 7 anni (dai 43 ai 49) perché, ebbene sì capitava anche quello sui vecchi PC, avevo esaurito lo spazio su disco (40MB non sono poi così tanti, pare) e dunque non ha salvato quei dati nelle Gesta.
Una volta distrutto il Marchese Grandegrosso mi sono dedicato al Duca Cinturanera, riposando un paio di anni per rinforzare l'esercito, guadagnando e perdendo terreni.

Inviato da: selvenil 17 Aug 2021, 16:41

allora andiamo a iniziare, innanzitutto nel leggimi non c'è il changelog dopo la 2.22
secondo di poi se provo ad avviare la partita con invio mi dà permission denied in 242
ho installato il pcbasic 2.0.3 che hai linkato su
Ovviamente se eseguo il PCbasic come amministratore parte, credo che il problema sia il fatto che i file sono nella cartella programmi, ho dovuto modificare il famoso path da c:/user/nomeutente a "C:\Program Files (x86)\PC-BASIC 2.0\", a questo punto non conviene mettere i file direttamente nella cartella utente?
ho fatto una prova e tutto mi sembra a posto, domani vado avanti
Domanda il castello iniziale tutto grigio con le aste gialle non si può colorare di giallo anche il prato?

Inviato da: TheRuleril 18 Aug 2021, 09:33

CITAZIONE (selven @ 17 Aug 2021, 17:41) *
allora andiamo a iniziare, innanzitutto nel leggimi non c'è il changelog dopo la 2.22
secondo di poi se provo ad avviare la partita con invio mi dà permission denied in 242
ho installato il pcbasic 2.0.3 che hai linkato su
Ovviamente se eseguo il PCbasic come amministratore parte, credo che il problema sia il fatto che i file sono nella cartella programmi, ho dovuto modificare il famoso path da c:/user/nomeutente a "C:\Program Files (x86)\PC-BASIC 2.0\", a questo punto non conviene mettere i file direttamente nella cartella utente?
ho fatto una prova e tutto mi sembra a posto, domani vado avanti
Domanda il castello iniziale tutto grigio con le aste gialle non si può colorare di giallo anche il prato?

Grande selven. Il leggimi è provvisorio, devo ancora compilarlo con i cambiamenti dalla 2.23 alla 2.50, vero.

Invece di usare PCbasic 2.03, usa la 1.2.14, è più stabile e soprattutto più veloce.
Per il prato vedo come ci sta. in effetti potrebbe ricordare un campo di grano, più che un prato

Per i file sì, convienen metterli in un posto che non sia program files. Però devi ricordarti di aggiungere il path "DA" uguale al path dove hai i maniero.bas e maniero.int


EDIT: troppo?


meglio 2 righe, forse

Inviato da: selvenil 18 Aug 2021, 10:49

visto che il percorso di default di pcbasic punta alla cartella utente non conviene far mettere i file direttamente lì magari in una cartella manor o direttamente i file in c:?
le istruzioni dovrebbero diventare una cosa simile:

CITAZIONE
Istruzioni per l'installazione:

1- Scarica e installa PC-BASIC, l'emulatore di GW BASIC da https://github.com/robhagemans/pcbasic/releases

2 -Metti i due file maniero2.bas e maniero2.int nella cartella c:\maniero

3- Modifica il collegamento di PC-BASIC modificando il campo Da c:\users\nomeutente a c:\maniero

4- avvia PC basic e scrivi:

LOAD "MANIERO2"
deve darti Ok
Poi scrivi:
RUN

decisamente meglio 2 righe

Inviato da: TheRuleril 18 Aug 2021, 11:36

CITAZIONE (selven @ 18 Aug 2021, 11:49) *
visto che il percorso di default di pcbasic ....
RUN
CITAZIONE
decisamente meglio 2 righe

e due righe sia.


Ho comunque idea di creare un installer.

Inviato da: selvenil 22 Aug 2021, 14:43

Ho fatto un altro paio di partite rapide (in una mi hanno invaso e nell'altra avvelenato), e mi sembra tutto ok, adesso devo reimparare a giocare se voglio arrivare più avanti ;p

Inviato da: TheRuleril 22 Aug 2021, 20:51

CITAZIONE (selven @ 22 Aug 2021, 15:43) *
Ho fatto un altro paio di partite rapide (in una mi hanno invaso e nell'altra avvelenato), e mi sembra tutto ok, adesso devo reimparare a giocare se voglio arrivare più avanti ;p

Intanto grazie ancora per il supporto selven.

Ho messo al solito link il nuovo pacchetto. Ho ottimizzato il codice riuscendo a recuperare altri 500Bytes circa. Ora all'avvio ci sono circa 4,5KB free, l'out of memory è scongiurato.
Dai per cortesia un occhio anche ad errori nel testo (anche le istruzioni). Tipo anche parole attaccate fra di loro o numeri attaccati a parole, o "a capo" strani.


Ecco qualche consiglio per cavarsela:
- Non aver fretta di attaccare, e comunque buttati sempre prima su chi è più debole (lo capisci con le spie)
- Per mantenere un buon tasso di crescita servono più di 8 acri a testa, ma non scendere MAI sotto i 7 per i nobili, tendono a prendersela.
- cerca sempre di non tassare troppo, all'inizio stai passo (5-15% max) e quando sono carenti dagli il grano, se no possono morire come mosche, le tasse della chiesa e del Re ci sono sempre anche se metti le tue a zero.
- quando combatti tieni sempre d'occhio le TUE perdite. far diventare il tuo popolo in buona salute non è facile e perdere 2-3 anni a recuperare le perdite di attacchi insistenti andati male potrebbe precluderti la vittoria finale contro il Re.
- mantenere in vita un nobile sconfitto ti fa guadagnare un nobile, fa felice i nobili ma scontenta i contadini, viceversa uccidendolo scontenta i nobili e fa felice i contadini. Valuta come sei messo col morale in quel momento.
- vendere la tua terra ti fa guadagnare molto grano e può essrti utile in caso di terra esaurita o campagna militare imminente (per poter pagare i mercenari)
Spesso ho venduto terra ad un nobile e poi l'ho attaccato per riprendermela ;-)

Inviato da: TheRuleril 28 Aug 2021, 09:18

La 2.50 è in release candidate. Non aggiungo più feature mi limito alla riparazione del codice.

Segnalo alcune delle nuove caratteristiche:

Migliorato il sistema del morale, mi ero accorto che non era legato direttamente ai decessi e alla terra pro capite (gravissimo) e l'ho anche portato da 3 step a 5 (furiosi, scontenti, pacifici, felici appagati) così ti accorgi più in fretta quando cambia.

Migliorato il sistema di spionaggio rendendolo più solido e interessante, ti dice più roba più random, ora anche a zero spie puoi avere chance di qualche sporadica info.

Riscritto alcune parti del testo per miglior chiarezza e aggiunto tanta grafica.

Ho dovuto ottimizzare il codice per far spazio alle aggiunte, tanta roba la calcolavo o mettevo a schermo in modo inefficiente.
MA QUANTO E' BELLO E FACILE IL BASIC!

Un bug fastidioso che ho corretto era dopo la distribuzione delle terre.
Calcolava le nascite PRIMA degli eventi (rivolte, peste ecc.) E quindi se distribuivi al limite (7.0 pro capite) capitava che nascendo gente il procapite si abbassasse e quindi potevi avere rivolte e morte anche se tutti erano felici.

Inviato da: selvenil 28 Aug 2021, 11:29

allora bello il castello iniziale, non capisco il muro grigio di caratteri che appare dopo
ho trovato un bug quando provo a ridistribuire le terre mi salta in alto dal morale previsto e non dagli acri previsti dove scrive il massimo e non posso fare più nulla
Ti ricordo che nel leggimi il changelog è fermo alla 2.22

Inviato da: TheRuleril 28 Aug 2021, 19:54

CITAZIONE (selven @ 28 Aug 2021, 12:29) *
allora bello il castello iniziale, non capisco il muro grigio di caratteri che appare dopo

mi serviva una cornice per le nuove informazioni che ho segnato in alto a dx e per il morale in basso. nessuna cornice che ho provato mi convinceva, ho provato anche una texture di muro ma le info sembravano all'esterno del maniero, quindi le ho messe all'interno. Quella è una porzione di muro arabescato tipo carta da parati.

CITAZIONE
ho trovato un bug quando provo a ridistribuire le terre mi salta in alto dal morale previsto e non dagli acri previsti dove scrive il massimo e non posso fare più nulla

non riesco a riprodurlo. Che versione di pcbasic stai usando?
Stai usando l'ultima versione di maniero su drive? La data del file maniero.bas deve essere 28/08/21 ore 00:40.
Fai uno screenshot quando ti capita. Quando il cursore è spostato esci dal gioco con CTRL+C e dimmi la linea del Break.
Thanks

CITAZIONE
Ti ricordo che nel leggimi il changelog è fermo alla 2.22

Sì, lo so. il leggimi lo faccio alla fine.

Inviato da: selvenil 29 Aug 2021, 19:59

allora ho fatto una nuova partita e non mi è ricapitato l'errore in compenso anche se erano tutti felici mi hanno impiccato ;P
https://ibb.co/FscfzcJ
PS: molto bella l'animazione del grano che cresce

Inviato da: TheRuleril 30 Aug 2021, 15:39

Ma c'era una scritta tra "i ratti" e "il popolo ti invade"?
Avrebbe dovuto comparire in giallo lampeggiante "il popolo è in rivolta".
Se così fosse sarebbe tutto regolare.

Il check alla riga 370 che bypassa la rivolta e la possibile impiccagione SOLO SE tutte e tre le condizioni risultino VERE:

IF (MO(1)+MO(2))/2>.2 AND L(1)/P(1)>5 AND L(2)/P(2)>5

ovvero se la media del morale dei contadini e dei vassalli è maggiore di 0.2 ovvero furiosi (e qui c'eravamo)
E
la terra pro capite dei contadini è superiore a 5.0
E
la terra pro capite dei vassalli è superiore a 5.0

Hai sicuramente dato troppa poca terra ai contadii o ai vassalli, immagino a quest'ultimi visto che sono meno contenti degli altri.
Il morale, se dai troppa poca terra pro capite cambia in peggio ma ci vuole tempo perché passi da appagati a furiosi.
sebbene tu sia popolare tra la maggior parte dei vassalli alcuni si sono arrabbiati per le cattive condizioni in cui versa la propria gente e hanno invaso il maniero.

Pensi che debba modificare il check o il testo?

Inviato da: selvenil 30 Aug 2021, 17:31

la scritta gialla lampeggiante c'era quindi tutto ok, non saprei cosa devi modificare, ma vedere una schermata che dice che sono tutti felici e poi ti impiccano è un po' strano tant'è che avevo redistribuito tutto il possibile a me non era rimasto nemmeno un acro, non sto a sindacare su come viene calcolata la cosa però dovrebbe dirimi perchè vengo impiccato, se i vassalli hanno poca terra mi sembra strano che siano felici, può darsi che avessero meno di 5 acri a testa, ma non ricordo di aver letto da nessuna parte che questo fosse richiesto, magari potresti mettere un check quando ridistribuisci la terra che avvisi della cosa?
tieni conto che avevo nuovo popolo perchè avevo conquistato uno dei rivali, quindi erano diminuiti gli acri pro capite nonostante la terra fosse di più, e venivo da un paio di anni in cui i contadini erano arrabbiati, ma non mi avevano impiccato, poi vengo impiccato quando sono tutti contenti ;P

Inviato da: TheRuleril 30 Aug 2021, 17:55

Si tratta di un check del gioco originale che non ho mai pensato di cambiare.
Nell'introduzione ho scritto che non è consigliabile scendere sotto i 7 acri pro capite. Scriverlo ingame penso che spezzi la sospensione dell'incredulità.

Magari potrei dividere le rivolte. Se gli acri procapite sono bassi per i contadini potrebbero rivoltarsi solo loro. Però devo rivedere i calcoli successivi delle perdite.

Far abbassare repentinamente il morale tenderei ad escluderlo. Si tratta di un errore di distribuzione che sarebbe troppo difficile da recuperare, ti ci vorrebbero alemeno due/tre anni. Invece se ti va fatta bene e la rivolta viene sedata, l'anno dopo hai la possibilità di riparare alla distribuzione.

EDIT: aspetta aspetta.

Ho notato una cosa che si può migliorare e PENSO non rompa nulla:
Il calcolo del morale dovuto alla distribuzione delle terre viene fatto in concomitanza con la riscossione delle tasse.
Ho provato a spostarlo subito dopo la distribuzione, in modo che sia più diretto il cambio di morale sia in positivo che in negativo.
Dimmi come va.

Inviato da: selvenil 31 Aug 2021, 17:56

allora ho fatto un altro po' di partite, nelle prime la sfiga ha regnato sovrana e sono morto male, però ho visto un bug avevo sia i moggi che i fiorini negativi e si erano uniti in un'unica voce

Inviato da: TheRuleril 31 Aug 2021, 19:48

Ti chiedo ancora dove stai facendo girare maniero, su gwbasic sotto dosbox? su pcbasic v1.2.14 o su pcbasic 2.0.3?

Devo cercare di capire come riprodurlo perché se vedessi capirei meglio. Dove ti unisce le voci? nel riepilogo in alto o in quello iniziale?
A me non succede, mi servono più info. come i valori negativi che avevi (l'unico modo per avere un overlap di voci è che i moggi negativi superassero le 5 cifre.


Inviato da: selvenil 31 Aug 2021, 22:43

PC basic 2.0.3, nel riepilogo in alto mi dava un valore altissimo di moggi, dopo un po' si è sistemato da solo

Inviato da: TheRuleril 31 Aug 2021, 23:51

Ho preso le misure nel riepilogo perché stesse dentro le 5 cifre senza problemi. Moggi e fiorini possono essere tranquillamente 99.999, anche se improbabile.
Il fatto che si sia ripristinato propenderei per un problema di pcbasic.


Nuova versione online. Oggi ho lavorato su un nuovo blocco.
L'idea mi è venuta guardando il codice di Dukedom (il gioco del 1984 a cui Maniero si ispira) che ha richieste Random del Re di uomini o grano.
Un problema molto grosso in maniero è mantenere un buon equilibrio tra terreni e popolazione. Se si sfora troppo con la popolazione si va incontro a morale basso, rivolte e decessi.
Suona bruttissimo ma aver la possibilità di "liberarsi" di uomini potrebbe far cambiare le sorti della partita. Ecco che entra in gioco il Re.
Tra la stagione del raccolto e la distribuzione del grano carente alla popolazione ho messo il salvifico Re che entra a gamba tesa se hai già un debito e si offre magnanimamente di fartelo estinguere con uomini. Invece normalmente ha una chance del 30% di uscirsene con la richiesta.
Mandare via contadini o vassalli DOPO aver saputo come è andata la stagione del raccolto e PRIMA di elargire grano offre una grande possibilità strategica, a mio avviso.

va comunque betatestato.
Tutto orecchi per suggerimenti

Inviato da: TheRuleril 1 Sep 2021, 16:32

CITAZIONE (selven @ 31 Aug 2021, 23:43) *
PC basic 2.0.3, nel riepilogo in alto mi dava un valore altissimo di moggi, dopo un po' si è sistemato da solo

L'ho riprodotto e capito deove sta l'errore. In uno degli eventi casuali non ho trasformato il risultato di una operazione in intero.

Nuova versione online.

 

Inviato da: TheRuleril 2 Sep 2021, 20:47

Aggiornato il LEGGIMI, con estrema fatica. fat_banana.gif

Inviato da: TheRuleril 8 Sep 2021, 10:12

Una delle sfide più grosse del programmare in una lingua scritta nel 1983 che possa funzionare su sistemi dello stesso periodo è quella della RAM.
Il GW BASIC può gestire al massimo programmi di 60KB e sebbene MANIERO sia composto principalmente da codice, il progetto è cresciuto tantissimo in questi anni, e avendo aggiunto testo e nuove meccaniche e mi sono visto costretto a modificare il codice per mantenere una quantità di RAM libera adeguata alle operazioni.
Non ho voluto tagliare nulla né a livello narrativo né di codice. In questo periodo mi sono dedicato all'ottimizzazione di quest'ultimo e mi faceva piacere condividere, con chi avrà l'ardore di seguirmi, qualche soluzione tecnica.

Di seguito un esempio, prima la versione del 2018 e poi quella "ottimizzata" del 2021 annotata:


Questo blocco si occupa della generazione casuale degli eventi catastrofici che avvengono ad un dato punto dell'anno.
L'unica variabile da considerare che può modificare direttamente l'evento è SI ovvero la quantità di guardiani da assegnare alla supervisione delle scorte di grano (G).
Più magazzinieri assegni, meno probabile sarà il disastro (deciso all'inizio del blocco da PR, un numero INTERO casuale tra 0 e 100).
Ad esempio, se SI è 0, ovvero nessun guardiano, la probabilità che non succeda nulla è del 20% (check riga 5010, PR tra 0 e 20) se vero va in 5140, se falso in 5060 dove comincia un altro check, quello del TIPO di evento che accade e quanto grano andrà perduto (RA).
Sia che il check sia vero o falso la funzione ritorna al programma principale con RETURN.

CODICE
5000 PR=INT(RND*100)+1:LOCATE 17,1:PAR=1:IF G>1000 THEN PAR=G/1000
5001 IF SI=0 THEN 5010
5002 IF SI=1 THEN 5020
5003 IF SI=2 THEN 5030
5004 IF SI=3 THEN 5040
5005 IF SI=4 THEN 5050
5010 IF PR=>0 AND PR<=20 THEN 5140 ELSE GOSUB 76:GOTO 5060
5020 IF PR=>0 AND PR<=35 THEN 5140 ELSE GOSUB 76:GOTO 5060
5030 IF PR=>0 AND PR<=50 THEN 5140 ELSE GOSUB 76:GOTO 5060
5040 IF PR=>0 AND PR<=65 THEN 5140 ELSE GOSUB 76:GOTO 5060
5050 IF PR=>0 AND PR<=80 THEN 5140 ELSE GOSUB 76:GOTO 5060
5060 GOSUB 60:EV=INT(RND*5):COLOR 4
5070 IF EV=0 THEN GOSUB 60:RA=INT((150+RND*100)*(PAR)):IF RA=>G THEN ?"Ladri si sono introdotti nei tuoi magazzini trafugando tutto il grano rimasto." ELSE ?"Ladri si sono introdotti in un tuo magazzino trafugando"RA"moggi di grano."
5080 IF EV=1 THEN GOSUB 60:RA=INT((250+RND*150)*(PAR)):IF RA=>G THEN ?"Uno strano morbo ha colpito le scorte di grano. L'infezione le ha ridotte a 0." ELSE ?"Uno strano morbo ha colpito le scorte. Per non rischiare sono stati bruciati"RA"moggi."
5090 IF EV=2 THEN GOSUB 60:RA=INT((200+RND*150)*(PAR)):IF RA=>G THEN ?"Locuste hanno invaso i nostri magazzini di grano, distruggendo tutte le scorte." ELSE ?"Locuste hanno invaso parte dei magazzini, distruggendo"RA"moggi di grano."
5100 IF EV=3 THEN GOSUB 60:RA=INT((120+RND*160)*(PAR)):IF RA=>G THEN ?"Un incendio ha colpito i magazzini, tutto il grano è andato bruciato." ELSE ?"Un incendio ha colpito un magazzino,"RA"moggi di grano sono andati perduti."
5110 IF EV=4 THEN GOSUB 60:RA=INT((180+RND*120)*(PAR)):IF RA=>G THEN ?"Una alluvione ha flagellato la zona dei magazzini, l'intera scorta è andata     perduta." ELSE ?"Un'alluvione ha flagellato un magazzino, sono andati perduti"RA"moggi di grano."
5120 IF RA>G THEN G=0 ELSE G=G-RA:RA1=RA1+RA
5130 RETURN
5140 GOSUB 74:COLOR 2:?"Grazie al minuzioso e puntuale lavoro dei tuoi lavoratori (più un pizzico di":?"fortuna) nessuna calamità ha colpito le tue riserve di grano quest'anno.":?:RETURN




Il blocco seguente occupa 1275 Bytes contro i 1964 Bytes del precedente ed ha esattamente la stessa funzione con qualche miglioria.

CODICE
18 PR=INT(RND*100)+1:?:?
19 IF SI=0 AND PR>80 THEN 33
20 IF SI=1 AND PR>65 THEN 33
21 IF SI=2 AND PR>50 THEN 33
22 IF SI=3 AND PR>35 THEN 33
23 IF SI=4 AND PR>20 THEN 33
25 EV=INT(RND*5)+1:GOSUB 76:RA=INT(((RND*G/2)+(RND*EV*250))/((RND*SI)+1)):COLOR 4
26 IF EV=1 THEN ?"Ladri si sono introdotti nei tuoi magazzini trafugando";:IF RA=>G THEN ?" tutto il grano rimasto." ELSE ?RA W$"."
27 IF EV=2 THEN ?"Uno strano morbo ha colpito le tue scorte. ";:IF RA=>G THEN ?"L'infezione ha ridotto tutto il grano ad un ammasso putrescente." ELSE ?"Per non correre rischi sono stati bruciati"RA W$"."
28 IF EV=3 THEN ?"Le locuste hanno invaso i tuoi magazzini, distruggendo";:IF RA=>G THEN ?" tutte le scorte." ELSE ?RA W$"."
29 IF EV=4 THEN ?"Un grave incendio ha colpito i magazzini,";:IF RA=>G THEN ?" tutto il grano è andato bruciato." ELSE ?RA U$" sono andati in fumo."
30 IF EV=5 THEN ?"Un'alluvione ha flagellato la zona dei magazzini, ";:IF RA=>G THEN ?"l'intera scorta è andata perduta." ELSE ?"sono andati perduti"RA W$"."
31 IF RA=>G THEN G=0 ELSE G=G-RA:RA1=RA1+RA
32 RETURN
33 GOSUB 74:COLOR 2:?"Grazie al minuzioso e puntuale lavoro dei tuoi lavoratori (più un pizzico di":?"fortuna) nessuna calamità ha colpito le tue riserve di grano quest'estate.":?:RETURN


La prima modifica che salta all'occhio è il renumber delle linee, numeri a due cifre rispetto a 4. Sempre in piccolezze del genere ho spostato la generazione di PR da 0-100 a 1-101 in modo da omettere il simbolo = nel check della probabilità mantenendo le stesse percentuali. >80 significa da 81 a 101 (sottointeso visto che PR al massimo può essere 101).
la seconda è la sezione 5001-5050 che diventa 19-23 e raggruppa due IF in due linee diverse in uno essendo sostanzialmente check sequenziali e forzati.
Ho inoltre disposto in maniera decrescente le percentuali da 80 a 20 perché se una sola delle due condizioni è falsa anche tutte le altre lo sono e dunque passa direttamente alla riga 25.
Poniamo che SI=2 e PR=45: il check partirà dalla riga 19 ed essendo tutte condizioni FALSE arriverà fino alla riga 25 dove comincerà il check dell'evento avendo il guardiano fallito nel suo intento (avrebbe dovuto superare il 50% ovvero PR>50).
Se invece PR fosse stato 90, la riga 21 avrebbe dato esito VERO e dunque il programma sarebbe passato alla riga 33, dando l'evento positivo.
Il blocco del testo degli eventi ho deciso di ridurlo usando la costante stringa W$ al posto di "moggi di grano" e togliere le parti ridondanti del testo iniziale mettendolo solo nello THEN e togliendolo dall'ELSE.
Inoltre ho rimosso il calcolo dei moggi persi togliendolo da ogni riga e mettendolo solo nella 25 e sostituendolo con un algoritmo più interessante.
Alla riga 25 comincia il check dell'evento e ho deciso di legarlo sia alla variabile EV che a quella SI. Più l'evento è alto (1-5) più alta sarà la perdita di grano essendo la catastrofe più grave (furto < morbo < locuste < incendio < alluvione).
All'opposto invece, maggiore sarà SI (l'investimento sui guardiani) minore sarà la perdita di grano.
Per testare la bontà dell'algoritmo ho scritto un programmino ad hoc che visualizzasse la distribuzione statistica degli eventi in relazione a queste due variabili:

CODICE
5 RANDOMIZE TIMER:CLS:?"Statistical distribution of random natural events (SI=0 TO 4) ongoing...":ON ERROR GOTO 25
6 ?:?" SI":?"  0%":?" 10%":?" 20%":?" 30%":?" 40%":?" 50%":?" 60%":?" 70%":?" 80%":?" 90%":?"100%"
7 T1=TIMER:FOR SI=0 TO 4:G10=0:G20=0:G30=0:G40=0:G50=0:G60=0:G70=0:G80=0:G90=0:G100=0:FOR I=1 TO 1000000
10 EV=INT(RND*5)+1:G=INT(RND*10000):RA=INT((RND*G/2)+(RND*EV*250))/((RND*SI)+1):PERC=RA*100/(G+0.1)
11 IF PERC<=0 THEN G0=G0+1
12 IF PERC>0 AND PERC<=10 THEN G10=G10+1
13 IF PERC>10 AND PERC<=20 THEN G20=G20+1
14 IF PERC>20 AND PERC<=30 THEN G30=G30+1
15 IF PERC>30 AND PERC<=40 THEN G40=G40+1
16 IF PERC>40 AND PERC<=50 THEN G50=G50+1
17 IF PERC>50 AND PERC<=60 THEN G60=G60+1
18 IF PERC>60 AND PERC<=70 THEN G70=G70+1
19 IF PERC>70 AND PERC<=80 THEN G80=G80+1
20 IF PERC>80 AND PERC<=90 THEN G90=G90+1
21 IF PERC>90 AND PERC<=100 THEN G100=G100+1
22 NEXT:LOCATE 3,(SI+1)*12:?SI:LOCATE 4,(SI+1)*12:?G0:LOCATE 5,(SI+1)*12:?G10:LOCATE 6,(SI+1)*12:?G20:LOCATE 7,(SI+1)*12:?G30:LOCATE 8,(SI+1)*12:?G40:LOCATE 9,(SI+1)*12:?G50
23 LOCATE 10,(SI+1)*12:?G60:LOCATE 11,(SI+1)*12:?G70:LOCATE 12,(SI+1)*12:?G80:LOCATE 13,(SI+1)*12:?G90:LOCATE 14,(SI+1)*12:?G100:NEXT
24 T2=TIMER:?"Execution time for"I*5"iterations: ";:?INT(T2-T1):END
25 LOCATE 15+SI,1:?"SI="SI"  EV="EV"  G="G"  RA="RA"  PERC="PERC:RESUME NEXT


ed ecco l'output su un campione di 5 milioni di iterazioni:

CODICE
Statistical distribution of random natural events (SI=0 TO 4) ongoing...
SI         0           1           2           3           4
  0%        5           6           11          12          17
10%        74698       146235      226351      310990      399003
20%        148396      247962      341132      368015      345788
30%        169462      260515      216470      160447      126812
40%        178459      167264      100198      72203       56242
50%        183660      78272       46347       33751       26450
60%        111137      31370       19722       14612       11933
70%        40257       15285       10293       7983        6535
80%        20289       9289        6577        5206        4222
90%        12719       6369        4604        3660        3150
100%        8946        4710        3402        2757        2381
Execution time for 5.000005e+06 iterations:  0.4774314090027474

si noti come il grosso degli esiti tenda a spostarsi verso la perdita minore (0%) all'aumentare di SI.

Se siete arrivati a leggere fino a qui complimenti per la pazienza. ;-)
Per oggi è tutto, state sintonizzati per altre strabilianti avventure nel mondo del BASIC!

Inviato da: TheRuleril 9 Sep 2021, 21:37

Altra puntata di "impara" il BASIC col Rullo.

Questa volta il blocco ottimizzato è quello della visualizzazione grafica della battaglia:

CODICE
5410 VIEW ?:CLS:GOSUB 60:BAT=INT(RND*90)+10:COLOR 14:?"ALL'ATTACCOOOOO!!! "
5411 BAT=BAT-1:IF BAT=0 THEN RETURN ELSE RANDOMIZE TIMER:X=INT(RND*41)+1
5412 IF X>0 AND X<=30 THEN 5422 ELSE IF X>30 AND X<=31 THEN 5423 ELSE IF X>31 AND X<=32 THEN 5424 ELSE IF X>32 AND X<=33 THEN 5425
5413 IF X>33 AND X<=35 THEN 5426 ELSE IF X>35 AND X<=37 THEN 5427 ELSE IF X>37 AND X<=39 THEN 5428 ELSE IF X>39 AND X<=41 THEN 5429
5422 GOSUB 70:?"             ";:GOTO 5411
5423 COLOR 14:?" ATTACCATE! ";:GOTO 5411
5424 COLOR 14:?" NON ARRETRATE! ";:GOTO 5411
5425 COLOR 14:?" DIFEDETE LA POSIZIONE! ";:GOTO 5411
5426 GOSUB 82:COLOR 3:?" SBANG! ";:GOTO 5411
5427 GOSUB 84:COLOR 2:?" WOOSH! ";:GOTO 5411
5428 GOSUB 86:COLOR 4:?" SDENG! ";:GOTO 5411
5429 GOSUB 74:COLOR 6:?" CLANK! ";:GOTO 5411

I GOSUB sono delle subroutine di suono in cui faccio il check del parametro SOU=1 (sound ON) ed esegui il suono se vero.
Come prima cosa definisco un numero random tra 10 e 100 e lo assegno alla variabile BAT dopo di che dalla riga 5411 comincio a decrementarlo e ogni volta che il loop torna alla riga 5411. Quando BAT arriva a 0 esce dalla routine e torna al gioco. Poi definisco X tra 1 e 41.
i check IF delle righe 5412 e 5413 servono ad indirizzare X verso gli slogan della battaglia da visualizzare, tutti con il loro suono e colore.
L'unica riga particolare è la 5422 che stampa una decina di spazi. E' anche la più probabile essendo l'IF X>0 AND X<=30, questo per rendere gli slogan più radi e distanziati.
Il codice è altamente infefficente, sia in termini di spazio che di velocità.

L'output a video:

Nota: il ? è una abbreviazione del comando PRINT.

Per migliorare le prestazioni ho utilizzato l'approccio ad ARRAY con il comando DATA che permette di immagazzinare in una riga in un punto qualunque del programma una serie di costanti, per poi leggerle con READ quando ci fa più comodo.

CODICE
100 CLS:BA=INT(RND*90)+10
101 X=INT(RND*15)+1:COLOR X:IF X>9 THEN ?STRING$(32,32); ELSE GOSUB 68:PRINT Z$(X);
102 BA=BA-1:IF BA=0 THEN RETURN ELSE 101
121 FOR X=1 TO 9:READ Z$(X):NEXT:DATA " CLANK!"," ATTACCATE!"," NON ARRETRATE!"," DIFEDETE LA POSIZIONE!"," SBANG!"," WOOSH!"," SDENG!"," TRUCIDATELI TUTTI!"," PER IL MANIERO!"


la riga 121 ha la lista delle costanti (gli sogan) e la loro lettura DA 1 A 9 (la posizione in lista) messa in Z$(X).
questa funziona merita un minimo di spiegazione.
Z è una lettera che assegna l'utente, potrebbe essere di una o più lettere. E' il nome mnemonico che vuoi dare alla ta variabile.
$ perché quello che si aspetta il basic è una stringa di testo e non un numero. Se avessi voluto immagazzinarvi un numero avrei omesso il $.
(X) è il modo veloce per definire più variabili in una botta sola. Il ciclo FOR NEXT entro cui è READ Z$(X) reitera l'immagazzinamento delle costanti nelle variabili Z$ per X volte, in questo caso 9.
il risultato di questo ciclo è la definizioni delle seguenti variabili:
Z$(1)=" CLANK!"
Z$(2)=" ATTACCATE!"
...
Z$(9)=" PER IL MANIERO!"

il principio del loop è lo stesso, dato un BA random itera fino a che BA va a zero e poi esci (RETURN) altrimenti torna a 101
la riga 101 è dove accade il print. Definisco un'altra variabile X da 1 a 15, se X è maggiore di 9 stampa 32 caratteri di fila di valore null (il 32 nella tabella ascii) altrimenti stampa la variabile Z$(X). Dove X è il numero random tra 1 e 9.
Dunque se verrà fuori un X=8 verrà stampata la variabile Z$(8) ovvero " TRUCIDATELI TUTTI!".

il GOSUB per il suono ora è random con un valore della nota (X) che va da 40 a 50K.
CODICE
68 IF SOU=1 THEN SOUND X^4+36,2
69 RETURN


potreste essrervi chiesti come mai a volte tra un comando e l'altro si usi : o ;. La differenza sta nel come si vuole che venga eseguito il codice. il: è il vero delimitatore tra comandi e una volta eseguito va a capo mentre il ; significa che vuoi eseguire il comando subito di seguito.
lo stesso print scritto senza e con il ;

10 PRINT "HELLO":PRINT "WORLD"
produce:
HELLO
WORLD

10 PRINT "HELLO";:PRINT "WORLD"
produce
HELLOWORLD

Alla prossima!

Inviato da: selvenil 10 Sep 2021, 11:51

Al momento sto giocando a pathfinder appena posso vado avanti a testare

Inviato da: TheRuleril 14 Sep 2021, 15:42

Ho riscritto il calcolo delle morti e delle nascite a fine turno in modo che fosse propozionale con il morale (un valore che va da 0.01 a 3.00).
La convoluta formula originale non ne teneva conto, si trattava di un calcolo legato totalmente al caso:

CODICE
FOR A=1 TO 3

P(A)=P(A)+INT(RND*(P(A)/9)+3.5)-INT(RND*(P(A)/11)+1.5)

P(A+3)=P(A+3)+INT(RND*(P(A)/2.5-P(A+3))/2+RND*P(A+3)/5-P(A+3)/10)

NEXT


P(1)=Contadini
P(2)=Vassalli
P(3)=Nobili

il ciclo FOR da 1 a 3 cambia il valore della variabile A, la seconda parte (A+3) fa riferimento alle persone di sana costituzione (ovvero i soldati). Un modo furbo per avere in un unico ciclo di 3 passaggi due formule diverse.

P(4)=Contadini sani
P(5)=Vassalli sani
P(6)=Nobili sani

Le nuove formule:
CODICE
FOR A=1 TO 3

P(A)=P(A)+INT(MO(A)*P(A)/22-RND*P(A)/10)

P(A+3)=P(A+3)+INT(MO(A)*(P(A)-P(A+3))/10-RND*(P(A+3)/4))

NEXT


Per testarne la bontà ho adattato il programmino che avevo scritto per i disastri casuali e questo è l'output per il morale a step di 0.2:
CODICE
Statistical distribution of random births/deaths (MO=0 TO 3) ongoing...

MO 3.0 2.8 2.6 2.4 2.2 2.0 1.8 1.6 1.4 1.2 1.0 0.8 0.6 0.4 0.2 0.0
-15 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
-10 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
- 5 0   0   0   0   0   0   0   0   0   0   31  145 245 331 385 518
  0 0   0   0   0   0   84  172 266 390 405 501 484 512 490 521 483
+ 5 136 247 319 428 508 508 526 508 489 536 469 372 244 180 95  0
+10 498 504 498 502 493 409 303 227 122 60  0   0   0   0   0   0
+15 367 250 184 71  0   0   0   0   0   0   0   0   0   0   0   0
+20 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
+25 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
+30 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
+35 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

La forbice dell'incremento/decremento di popolazione (sempre positivo solo sopra i 2.2 di morale) va dal +15% al -10% di P(A) .


diverso invece per le persone di sana costituzione:
CODICE
MO 3.0 2.8 2.6 2.4 2.2 2.0 1.8 1.6 1.4 1.2 1.0 0.8 0.6 0.4 0.2 0.0          
-15 0   0   0   0   0   0   0   0   0   0   0   31  125 215 308 402            
-10 0   0   0   0   0   0   0   0   0   46  181 230 193 201 190 183            
- 5 0   0   0   0   0   0   0   80  163 202 195 191 201 218 206 228            
  0 0   0   0   0   3   91  193 211 205 216 196 203 204 203 206 188            
+ 5 0   0   13  122 199 198 211 185 206 200 198 191 220 164 91  0              
+10 42  149 210 197 208 179 198 187 195 189 173 155 58  0   0   0              
+15 197 184 206 209 198 212 183 217 191 148 58  0   0   0   0   0              
+20 189 192 198 187 194 207 201 121 41  0   0   0   0   0   0   0              
+25 203 197 192 195 199 114 15  0   0   0   0   0   0   0   0   0              
+30 202 218 182 91  0   0   0   0   0   0   0   0   0   0   0   0              
+35 168 61  0   0   0   0   0   0   0   0   0   0   0   0   0   0

forbice più larga che va dal +35% al -20% di P(A+3)

Inviato da: TheRuleril 20 Sep 2021, 08:36

Parlando di flusso di gioco e non per questa volta di meccaniche, nella versione originale di Leon Baradat al giocatore era presentata ogni volta una scelta con solo una parte delle informazioni a volte solo quelle funzionali come ad esempio
"I tuoi contadini sono a corto di grano, quanto vuoi dargliene? hai a disposizione 500 moggi"
I dati del gioco però vengono comunque presi in considerazioni nei calcoli come il limite di moggi pro capite sotto il quale cominciano i decessi, il numero di contadini, la quantità di grano che hanno prodotto ecc. Tutte informazioni utili alle scelte del giocatore che, meta-parlando, un consigliere esperto era in grado di fornirti all'epoca.

Qui l'idea di creare un riepilogo informativo sempre aggiornato con il più altro numero possibile di informazioni utili alle scelte di gioco.
Omettendo ovviamente tutte quelle variabili che invece aiuterebbero troppo e toglierebbero immersività come la forza esatta di un avversario, tutte le variabili della battaglia, eccetera.


Mi sono trovato recentemente a modificare la grafica e perché non includerla anche nel riepilogo. Di seguito tutte le versioni e le varianti uscite durante il processo creativo.

Notare che in GWBASIC non è presente interlinea, dunque le linee verticali risulteranno unite a differenza di quelle nei codebox di seguito:

la v1 presente in maniero 2.22:

CODICE
│ I tuoi possedimenti        75 acri       15 fiorini    150 moggi di grano    │
│    1385 acri totali        75 servi      15 nobili     60 contadini          │
│     In buona salute        30 servi      8 nobili      22 contadini          │
└──────────────────────────────────────────────────────────────────────────────┘



la v2 presente in maniero 2.40 (mai rilasciata), e sue varianti:

CODICE
╔════I tuoi possedimenti════╦═contadini══╦═vassalli═══╦══nobili════╦═sol═╦═pop═╗
║ 75 acri      1385 totali  ║ 22 / 60      30 / 75       8 / 15    ╠ 60  ╩ 150 ╣
║ 913 moggi    50 fiorini   ║ pacifici     pacifici      pacifici  ║  ESTATE   ║
╚═══════════════════════════╩════════════╩════════════╩════════════╩═══════════╝


varianti v2:
╔════I tuoi possedimenti════╦═contadini═╦═vassalli══╦══nobili═══╦═sol═╦═pop═╗
║ 75 acri      1385 totali  ║ 100 ╩ 100 ║ 100 ╩ 100 ║ 100 ╩ 100 ╠ 60  ╩ 150 ╣
║ 913 moggi    50 fiorini   ║ pacifici  ║ pacifici  ║ pacifici  ║  ESTATE   ║
╚═══════════════════════════╩═══════════╩═══════════╩═══════════╩═══════════╝
╔═acri╦═moggi╦═fio═╦══════════════════╦contadini╦vassalli═╦═nobili══╦═sol╦═pop═╗
║ 1000╚ 10000╩ 1000╣                  ╠ 100╩ 100╬ 100╩ 100╬ 100╩ 100╬ 60 ╩ 150 ╣
║ 90000  a maggese ╣                  ║scontenti║felici   ║felici   ║ AUTUNNO  ║
╚══════════════════╩══════════════════╩═════════╩═════════╩═════════╩══════════╝

╔═acri╦═moggi╦═fio═╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦contadini╦vassalli═╦═nobili══╦═sol╦═pop═╗
║ 1000╚ 10000╩ 1000╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣ 100╩ 100╬ 100╩ 100╬ 100╩ 100╬ 60 ╩ 150 ╣
║ 90000  a maggese ╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣scontenti║felici   ║felici   ║ AUTUNNO  ║
╚══════════════════╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩═════════╩═════════╩═════════╩══════════╝

╔═acri═╦═moggi═╦═fio═╦═════════╦═contadini═╦═vassalli══╦══nobili═══╦═sol═╦═pop═╗
║ 9000 ╚ 10000 ╩ 100 ╣         ╠ 100 ╩ 100 ╬ 100 ╩ 100 ╬ 100 ╩ 100 ╬ 60  ╩ 150 ╣
║ 1000   a maggese   ║         ║ scontenti ║ felici    ║ felici    ║  AUTUNNO  ║
╚════════════════════╩═════════╩═══════════╩═══════════╩═══════════╩═══════════╝

╔═acri═╦═moggi═╦═fio═╦╦╦╦╦╦╦╦╦╦╦═contadini═╦═vassalli══╦══nobili═══╦═sol═╦═pop═╗
║ 9000 ╚ 10000 ╩ 100 ╠╬╬╬╬╬╬╬╬╬╣ 100 ╩ 100 ╬ 100 ╩ 100 ╬ 100 ╩ 100 ╬ 60  ╩ 150 ╣
║ 1000   a maggese   ╠╬╬╬╬╬╬╬╬╬╣ scontenti ║ felici    ║ felici    ║  AUTUNNO  ║
╚════════════════════╩╩╩╩╩╩╩╩╩╩╩═══════════╩═══════════╩═══════════╩═══════════╝

╔═acri╦═moggi╦═fio═╦═══contadini═══╦════vassalli═══╦════nobili═════╦═sol╦═pop═╗
║ 9000╚ 10000╚ 1000║ 100  scontenti║ 100  scontenti║ 100  scontenti║ 60 ╩ 150 ║
║ 1000 a maggese   ║ 100  a maggese║ 100  a maggese║ 100  a maggese║ AUTUNNO  ║
╚══════════════════╩═══════════════╩═══════════════╩═══════════════╩══════════╝

╔═acri╦═moggi╦═fio═╦═══contadini══╦═══vassalli═══╦════nobili════╦════════╗
║ 9000╚ 10000╚ 1000║ 100 scontenti║ 100 scontenti║ 100 scontenti║ 300 sol║
║ 1000 a maggese   ║ 300 a maggese║ 300 a maggese║ 300 a maggese║ 900 pop║
╚══════════════════╩══════════════╩══════════════╩══════════════╩════════╝

╔═acri╦═moggi╦═fio═╦╦╦╦╦═══contadini══╦═══vassalli═══╦════nobili════╦════════╗
║ 9000╚ 10000╚ 1000╠╬╬╬╣ 100 scontenti║ 100 scontenti║ 100 scontenti║ 300 sol║
║ 1000 a maggese   ╠╬╬╬╣ 300 a maggese║ 300 a maggese║ 300 a maggese║ 900 pop║
╚══════════════════╩╩╩╩╩══════════════╩══════════════╩══════════════╩════════╝

╔═acri╦═moggi╦═fio═╦═contadini═╦═vassalli══╦══nobili═══╦═sol═╦═pop═╗
║ 9000╚ 10000╚ 1000║ 100 ╩ 100 ║ 100 ╩ 100 ║ 100 ╩ 100 ╠ 60  ╩ 150 ╣
║ 1000 a maggese   ║ pacifici  ║ pacifici  ║  pacifici ║  ESTATE   ║
╚══════════════════╩═══════════╩═══════════╩═══════════╩═══════════╝

╔═acri═╦═moggi═╦═fio══╦═contadini═╦═vassalli══╦══nobili═══╦═sol═╦═pop══╗
║ 9000 ╚ 10000 ╚ 1000 ║ 100 ╩ 100 ║ 100 ╩ 100 ║ 100 ╩ 100 ╠ 60  ╩ 150  ╣
║ 1000  a maggese     ║ pacifici  ║ pacifici  ║  pacifici ║  ESTATE    ║
╚═════════════════════╩═══════════╩═══════════╩═══════════╩════════════╝



la v3 presente in maniero 2.45 e varianti:
CODICE
╔ acri ╦ moggi ╦ fio  ╦╦╦╦╦ contadini ╦ vassalli  ╦  nobili   ╦╦╦╦╦ sol ╦ pop  ╗
║ 9000 ╚ 10000 ╚ 1000 ╠╬╬╬╣ 100 ╩ 100 ║ 100 ╩ 100 ║ 100 ╩ 100 ╠╬╬╬╣ 60  ╩ 150  ╣
║ 1000  a maggese     ╠╬╬╬╣ pacifici  ║ pacifici  ║  pacifici ╠╬╬╬╣  ESTATE    ║
╚═════════════════════╩╩╩╩╩═══════════╩═══════════╩═══════════╩╩╩╩╩════════════╝

v3 variante
╔╦╗ acri ╔ moggi ╔ fio  ╔╦╦╗ contadini ╦ vassalli  ╦  nobili   ╔╦╗ sol ╔ pop ╔╦╗
╠╬╣ 9000 ╚ 10000 ╚ 1000 ╠╬╬╣ 100 ╩ 100 ║ 100 ╩ 100 ║ 100 ╩ 100 ╠╬╣ 60  ╚ 1505╠╬╣
╠╬╣ 1000    a maggese   ╠╬╬╣ pacifici  ║ pacifici  ║ pacifici  ╠╬╣   ESTATE  ╠╬╣
╚╩╩═════════════════════╩╩╩╩═══════════╩═══════════╩═══════════╩╩╩═══════════╩╩╝

╔╦╗      ╔       ╔      ╔╦╗           ╦           ╦           ╔╦╗     ╔      ╔╦╗
╠╬╣      ╚       ╚      ╠╬╣     ╩     ║     ╩     ║     ╩     ╠╬╣     ╚      ╠╬╣
╠╬╣                     ╠╬╣           ║           ║           ╠╬╣            ╠╬╣
╚╩╩═════════════════════╩╩╩═══════════╩═══════════╩═══════════╩╩╩════════════╩╩╝



le varianti v4 e quella che presumibilmente sarà la versione finale rilasciata con la v2.5 Deluxe:
CODICE
╔═╗ acri ╦ moggi ╦ fio  ╦═╦═ contadini ╦ vassalli  ╦  nobili   ╦═╦ sol ╔ pop ╦═╗
╠╦╩ 9000 ╚╗10000 ╩ 1000 ╩╦╩╦ 100 ╩ 100 ╬ 100 ╩ 100 ╬ 100 ╩ 100 ╩╦╩ 60  ╚ 1505╚╦╣
╠╩╦ 1000 ╔╝ a maggese   ╦╩╦╩ pacifici  ╬ pacifici  ╬ pacifici  ╦╩╦   ESTATE  ╦╩╣
╚═╩══════╩══════════════╩═╩════════════╩═══════════╩═══════════╩═╩═══════════╩═╝

╔═╗ acri ╦ moggi ╦ fio ═╦═╦═ contadini ╦ vassalli ═╦═ nobili ╦═╦═╦ sol ╦ pop ╦═╗
╠╦╩ 9000 ╚ 10000 ╩ 1000 ╩╦╩╦ 100 ╩ 100 ╩ 100 ╩ 100 ╩ 100 ╩ 100 ╩╦╩ 60  ╩ 1505╚╦╣
╠╩╦ 1000 ╔╝ a maggese   ╦╩╦╩ pacifici  ╦ pacifici  ╦ pacifici  ╦╩╦═  ESTATE  ╦╩╣
╚═╩══════╩══════════════╩═╩════════════╩═══════════╩═══════════╩═╩═══════════╩═╝


╔═╦ acri ╦ moggi ╦ fio ═╦═╦═ contadini ╦ vassalli ═╦═ nobili ╦═╦═╦ sol ╦ pop ╦═╗
╠╦╩ 9000 ╩ 10000 ╩ 1000 ╩╦╩╦ 100 ╩ 100 ╩ 100 ╩ 100 ╩ 100 ╩ 100 ╩╦╩ 60  ╩ 1505╚╦╣
╠╩╦ 1000 ╦╩ a maggese ╦═╦╩╦╩ scontenti ╦ felici    ╦ pacifici  ╦╩╦ PRIMAVERA ╦╩╣
╚═╩════╩═╩═╩══════════╩═╩═╩═╩════════╩═╩═════════╩═╩═════════╩═╩═╩═╩═══════╩═╩═╝

╔═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦═╦╗
╠╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╣
╠╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╩╦╣
╚═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩═╩╝



    acri   moggi   fio       contadini   vassalli     nobili       sol   pop
    9000   10000   1000      100   100   100   100   100   100     60    1505
    1000    a maggese        scontenti   felici      pacifici       AUTUNNO
    
╔═╦      ╦       ╦     ═╦═╦═           ╦          ═╦═        ╦═╦═╦     ╦     ╦═╗
╠╦╩      ╩       ╩      ╩╦╩╦     ╩     ╩     ╩     ╩     ╩     ╩╦╩     ╩     ╚╦╣
╠╩╦      ╦╩           ╦═╦╩╦╩           ╦           ╦           ╦╩╦           ╦╩╣
╚═╩════╩═╩═╩══════════╩═╩═╩═╩════════╩═╩═════════╩═╩═════════╩═╩═╩═╩═══════╩═╩═╝


    9000   10000   1000      100   100   100   100   100   100     60    1505
    1000

╔═╦ acri ╦ moggi ╦ fio ═╦═╦═ contadini ╦ vassalli ═╦═ nobili ╦═╦═╦ sol ╦ pop ╦═╗
╠╦╩ 1385 ╩ 763   ╚ 50  ╔╩╦╩╦ 22  ╩ 60  ╩ 30  ╩ 75  ╩ 8   ╩ 22  ╩╦╩ 53  ╩ 150 ╚╦╣
╠╩╦ 75  ╩╦╩ discreta  ╦╩╦╩╦╩ pacifici  ╦ pacifici  ╦ pacifici  ╦╩╦  ESTATE   ╦╩╣
╚═╩════╩═╩═╩══════════╩═╩═╩═╩════════╩═╩═════════╩═╩═════════╩═╩═╩═╩═══════╩═╩═╝

╔═╦ acri ╦ moggi ╔ fiorini╔═ contadini ╦ vassalli ═╦═ nobili ╦═╦═╦ sol ╦ pop ╦═╗
╠╦╩ 1385 ╩ 913  ═╩ 50  ╔═╦╩╦ 22 ═╩ 60 ═╩ 30 ═╩ 75 ═╩ 8  ═╩ 22 ═╩╦╩ 53 ═╩ 150 ╚╦╣
╠╩╦ 75  ╩╦╩   buona   ╦╩╦╩╦╩ pacifici  ╦ pacifici  ╦ pacifici  ╦╩╦  ESTATE   ╦╩╣
╚═╩════╩═╩═╩══════════╩═╩═╩═╩════════╩═╩═════════╩═╩═════════╩═╩═╩═╩═══════╩═╩═╝

v4 finale:
╔═╦ acri ╦ moggi ╔ fiorini╔═ contadini ╦ vassalli ═╦═ nobili ╦═╦═╦ sol ╦ pop ╦═╗
╠╦╩ 1385 ╩ 838  ═╩ 50  ╔═╦╩╦ 22 ═╩ 60 ═╩ 30 ═╩ 75 ═╩ 8  ═╩ 22 ═╩╦╩ 53 ═╩ 150 ╚╦╣
╠╩╦ 75  ╩╦╩ discreta ═╦╩╦╩╦╩ pacifici  ╦ pacifici  ╦ pacifici  ╦╩╦  ESTATE   ╦╩╣
╚═╩════╩═╩═╩════════╩═╩═╩═╩═╩════════╩═╩═════════╩═╩═════════╩═╩═╩═╩═══════╩═╩═╝


la sneak preview:



Alla prossima!

Inviato da: TheRuleril 24 Sep 2021, 23:18

Il betatest è ormai in corso da 2 mesi e direi che dovremmo essere agli sgoccioli.
Di strada ne ha fatta la 2.5, posso affermare che rispetto alla 2.22 il codice modificato è circa il 50%.
L'elenco delle nuove feature sarà presente nel Leggimi, ma ci tenevo a condividere la più recente delle feature:

- La mappa non è più solamente cosmetica. Introdotta la verifica delle adiacenze, in modo che un nobile possa attaccare solo i propri confinanti (nel gioco originale due feudi opposti si potevano attaccare ma di fatto non si scambiavano terra)

- La verifica delle adiacenze aggiunge un nuovo livello strategico al gioco, potenziando la compravendita dei terreni. Ad esempio per tagliare l'accesso ad un particolare feudo ad un altro nobile, escludendo la minaccia che quest'ultimo possa conquistarlo, oppure vendendo una striscia contigua di terra ad un feudo X per isolarsi dal feudo Y.



Inviato da: TheRuleril 25 Sep 2021, 15:50

Fatto il post sul perché, ora vi tocca il post sul come. ;-)


Il controllo viene effettuato su tutte e 4 le ortogonali di ogni casella. Il ciclo è relativamente veloce e si compone di un primo IF seguito da un secondo IF nested con i quattro OR.
Il ciclo comincia sempre dalla prima casella in alto a sinistra. Quando trova l'adiacenza esce subito dal ciclo e dà l'OK per l'attacco, se non trova l'adiacenza prosegue con la casella successiva fino alla fine della mappa in basso a destra senza dare l'OK.

CODICE
250 A=INT(RND*6):B=INT(RND*6):IF X=Y THEN 250
300 FOR Y=1 TO 22:FOR X=1 TO 40:IF T(Y,X)=SE(A) THEN IF T(Y,X+1)=SE(B) OR T(Y,X-1)=SE(B) OR T(Y+1,X)=SE(B) OR T(Y-1,X)=SE(B) THEN END
301 NEXT:NEXT:LOCATE 2,2:?"adiacenza non trovata":END



ho poi fatto un programmino per testare il check:
CODICE
10 DIM T(23,41):KEY OFF:CLS:RANDOMIZE TIMER
100 FOR A=1 TO 8:FOR B=1 TO 23:T(A,B)=176:NEXT:NEXT:FOR B=1 TO 15:T(9,B)=176:NEXT:FOR B=1 TO 14:T(10,B)=176:NEXT:FOR B=1 TO 10:T(11,B)=176:NEXT
101 FOR B=11 TO 14:T(11,B)=237:NEXT:FOR B=1 TO 14:T(12,B)=237:NEXT:FOR A=13 TO 17:FOR B=1 TO 15:T(A,B)=237:NEXT:NEXT:FOR B=1 TO 11:T(18,B)=237:NEXT
102 FOR A=1 TO 6:FOR B=24 TO 40:T(A,B)=8:NEXT:NEXT:FOR B=24 TO 32:T(7,B)=8:NEXT:FOR B=24 TO 31:T(8,B)=8:NEXT
103 FOR A=33 TO 40:T(7,A)=15:NEXT:FOR A=8 TO 19:FOR B=32 TO 40:T(A,B)=15:NEXT:NEXT:FOR A=9 TO 18:FOR B=30 TO 40:T(A,B)=15:NEXT:NEXT:FOR B=28 TO 29:T(17,B)=15:NEXT:FOR B=36 TO 40:T(20,B)=15:NEXT:FOR B=38 TO 40:T(21,B)=15:NEXT
104 FOR A=9 TO 16:FOR B=16 TO 29:T(A,B)=219:NEXT:NEXT:FOR A=10 TO 12:T(A,15)=219:NEXT:FOR B=16 TO 27:T(17,B)=219:NEXT:
105 FOR B=11 TO 29:T(18,B)=178:NEXT:FOR B=1 TO 31:T(19,B)=178:NEXT:FOR B=1 TO 35:T(20,B)=178:NEXT:FOR B=1 TO 37:T(21,B)=178:NEXT:FOR B=1 TO 40:T(22,B)=178:NEXT
120 SE(0)=219:SE(1)=176:SE(2)=237:SE(3)=178:SE(4)=15:SE(5)=8:SE(6)=206
130 CL(0)=2:CL(1)=13:CL(2)=11:CL(3)=14:CL(4)=12:CL(5)=15:CL(6)=9
210 CL=2:FOR A=1 TO 22:FOR B=1 TO 40
211 IF T(A,B)=T(A,B-1) THEN 213 ELSE IF T(A,B)=219 THEN CL=2 ELSE IF T(A,B)=176 THEN CL=13 ELSE IF T(A,B)=237 THEN CL=11 ELSE IF T(A,B)=178 THEN CL=14 ELSE IF T(A,B)=15 THEN CL=12 ELSE IF T(A,B)=8 THEN CL=15
212 COLOR CL
213 ?CHR$(T(A,B));:NEXT:?:NEXT
250 X=INT(RND*6):Y=INT(RND*6):IF X=Y THEN 250
255 LOCATE 12,60:COLOR CL(X):?STRING$(2,SE(X))"-->";:COLOR CL(Y):?STRING$(2,SE(Y)):LOCATE 1,1
300 FOR A=1 TO 22:FOR B=1 TO 40:LOCATE A,B:IF T(A,B)=SE(X) THEN IF T(A,B+1)=SE(Y) OR T(A,B-1)=SE(Y) OR T(A+1,B)=SE(Y) OR T(A-1,B)=SE(Y) THEN COLOR 26:?"X":GOTO 303
301 NEXT:NEXT:LOCATE 2,2:?"adiacenza non trovata":GOTO 303
303 WHILE INKEY$="":WEND:LOCATE 1,1:GOTO 210


 

Inviato da: TheRuleril 26 Sep 2021, 16:24

La funzione di disegno della mappa è una di quelle che ho cambiato più volte mantenendo sempre lo stesso layout, simboli, colori e posizione delle terre, ma con l'obiettivo di velocizzare l'output a schermo.

Il metodo originale è curioso e molto furbo.
Per rappresentare la mappa di 22x40 Leon Baradat ha assegnato ad ogni casella una variabile T(Y,X) con valori che vanno da T(1,1) a T(22,40).
All'inizio del gioco lui associa poi ad ognona di queste variabili T un numero che corrisponde ad un particolare carattere della tabella ascii che poi stamperà a schermo al momento opportuno col comando PRINT CHR$([0-255])
Ad esempio se la prima casella in alto a sx fosse del Duca Cinturanera, alla variabile verrebbe assegnato il valore 219:
T(1,1)=219
di modo che se dovesse stampare quella casella basterebbe il comando:
PRINT CHR$(T(Y,X))
ovvero
PRINT CHR$(219)

questa è la definizione delle variabili ad inizio gioco, ovvero il layout della mappa:

CODICE
130 FOR A=1 TO 10:FOR B=1 TO 23:T(A,B)=176:NEXT:NEXT:FOR A=17 TO 22:FOR B=1 TO 40:T(A,B)=178:NEXT:NEXT
140 FOR A=1 TO 5:FOR B=24 TO 40:T(A,B)=8:NEXT:NEXT:FOR A=9 TO 18:FOR B=30 TO 40:T(A,B)=15:NEXT:NEXT
150 FOR A=9 TO 16:FOR B=16 TO 29:T(A,B)=219:NEXT:NEXT:FOR A=11 TO 18:FOR B=1 TO 15:T(A,B)=177:NEXT:NEXT:FOR A=10 TO 12:T(A,15)=219:NEXT:FOR A=1 TO 10:T(11,A)=176:NEXT
160 FOR A=12 TO 15:T(18,A)=178:NEXT:FOR A=7 TO 8:FOR B=24 TO 31:T(A,B)=8:NEXT:NEXT:FOR A=38 TO 40:T(8,A)=15:NEXT:FOR A=24 TO 40:T(6,A)=8:NEXT:FOR A=16 TO 27:T(17,A)=219:NEXT
170 FOR A=7 TO 8:FOR B=32 TO 40:T(A,B)=15:NEXT:NEXT:FOR A=32 TO 40:T(19,A)=15:NEXT:T(7,32)=8:T(17,28)=15:T(17,29)=15:FOR A=36 TO 40:T(20,A)=15:NEXT:FOR A=38 TO 40:T(21,A)=15:NEXT

Già il codice è abbastanza efficiente perché usa dei cicli FOR-NEXT per assegnare lo stesso valore a caselle contigue, invece di assegnare il valore ad ogni variabile singolarmente, perché 22x40 sarebbero 880 definizioni.

esempio per una linea contigua:
FOR A=16 TO 27:T(17,A)=219:NEXT
Alle caselle dalla T(17,16) alla T(17,27) assegna il valore 219.

esempio per blocco (due cicli FOR nested)
FOR A=1 TO 10:FOR B=1 TO 23:T(A,B)=176:NEXT:NEXT
Alle caselle dalla T(1,1) alla T(10,23) assegna il valore 176.

piccola digressione sui cicli NESTED:
il seguente codice non fa nulla se non far passare del tempo ma è COME lo fa che è interessante per capire questa diavoleria dei cicli INNESTATI uno dentro l'altro. Molto comodi in programmazione perché evitano codice e fanno risparmiare tempo sia al programmatore che alla macchina.

FOR A=1 TO 10:FOR B=1 TO 8:NEXT:NEXT

la macchina comincia a contare dal ciclo più interno per poi uscire verso gli esterni. Nota che possono essrci ben più di due cicli innestati.
Comincia ad assegnare ad A il valore 1, poi a B il valore 1, dunque assegna a B il valore 2 e così via fino al valore 8, dopo di che dichiara finito il primo ciclo B (di 8) ed anche il primo ciclo A (di 10).
In seguito associa ad A il valore 2, poi a B il valore 1 (sovrascrivendo l'ultimo valore che era 8) e così via fino a B=8 dichiarando concluso anche il secondo ciclo B.
Dopo di che continua fino a che non è giunto a A=10 e B=8 e dichiara concluso anche il ciclo A.


Per creare il minor numero di comandi Baradat ha disegnato dei rettangoli poi ha aggiunto blocchetti e linee qua e là sovrascrivendo variabili già definite.
Io l'ho voluto riscrivere col numero minore di comandi ma senza sovrapposizioni:

CODICE
100 FOR A=1 TO 8:FOR B=1 TO 23:T(A,B)=176:NEXT:NEXT:FOR B=1 TO 15:T(9,B)=176:NEXT:FOR B=1 TO 14:T(10,B)=176:NEXT:FOR B=1 TO 10:T(11,B)=176:NEXT
101 FOR B=11 TO 14:T(11,B)=237:NEXT:FOR B=1 TO 14:T(12,B)=237:NEXT:FOR A=13 TO 17:FOR B=1 TO 15:T(A,B)=237:NEXT:NEXT:FOR B=1 TO 11:T(18,B)=237:NEXT
102 FOR A=1 TO 6:FOR B=24 TO 40:T(A,B)=8:NEXT:NEXT:FOR B=24 TO 32:T(7,B)=8:NEXT:FOR B=24 TO 31:T(8,B)=8:NEXT
103 FOR A=33 TO 40:T(7,A)=15:NEXT:FOR A=8 TO 19:FOR B=32 TO 40:T(A,B)=15:NEXT:NEXT:FOR A=9 TO 18:FOR B=30 TO 40:T(A,B)=15:NEXT:NEXT:FOR B=28 TO 29:T(17,B)=15:NEXT:FOR B=36 TO 40:T(20,B)=15:NEXT:FOR B=38 TO 40:T(21,B)=15:NEXT
104 FOR A=9 TO 16:FOR B=16 TO 29:T(A,B)=219:NEXT:NEXT:FOR A=10 TO 12:T(A,15)=219:NEXT:FOR B=16 TO 27:T(17,B)=219:NEXT:
105 FOR B=11 TO 29:T(18,B)=178:NEXT:FOR B=1 TO 31:T(19,B)=178:NEXT:FOR B=1 TO 35:T(20,B)=178:NEXT:FOR B=1 TO 37:T(21,B)=178:NEXT:FOR B=1 TO 40:T(22,B)=178:NEXT:T(1,1)=206

La quantità di codice è maggiore ma è più veloce perché non fa cose superflue.


Veniamo ora alla messa a schermo originale della mappa:
CODICE
1240 CLS:CL=2:FOR A=1 TO 22:FOR B=1 TO 40:IF T(A,B)=T(A,B-1) THEN 1250 ELSE IF T(A,B)=176 THEN CL=13 ELSE IF T(A,B)=177 THEN CL=11 ELSE IF T(A,B)=178 THEN CL=14 ELSE IF T(A,B)=15 THEN CL=12 ELSE IF T(A,B)=8 THEN CL=15 ELSE CL=2
1245 COLOR CL,0
1250 PRINT CHR$(T(A,B));:NEXT:PRINT:NEXT


I due cicli nested non sono altro che l'area della mappa: FOR A=1 TO 22:FOR B=1 TO 40

Dopo di che viene una condizionale IF che associa al volo il colore alla casella. SE T(A,B)=176 ALLORA CL=13, variabile CL che viene passata subito dopo a COLOR CL che in questo caso diventerà COLOR 13 ovvero porpora.
Stampa poi CHR$(176) e se non è arrivato alla fine della riga (A,40) allora continua con il ciclo delle B. Quando arriva a T(A,40) e terminato il primo dei 22 cicli A, passa alla A successiva andando a capo come definisce quel PRINT fra i due NEXT.

Questa stampa dura circa 2.6 secondi su un 386.


Questa invece è la mia ultima iterazione:
CODICE
210 FOR A=1 TO 22:FOR B=1 TO 40:IF T(A,B)=T(A,B-1) THEN 213
212 COLOR CF(CINT(T(A,B)/7.9))
213 ?CHR$(T(A,B));:NEXT:?:NEXT


Si può comprimere ancora un pelo togliendo la condizione che fa saltare la definizione del colore nel caso si trovino valori uguali contigui, ma poi rallenta. Su harware 386 le performance sono addirittura peggiori della versione originale.
Ad ogni modo questo sarebbe la versione in una sola linea:
CODICE
210 FOR A=1 TO 22:FOR B=1 TO 40:COLOR CF(CINT(T(A,B)/7.9)):?CHR$(T(A,B));:NEXT:?:NEXT


Stessi due cicli nested ma questa volta definisco il colore con una singola condizione invece di 6.
Questo approccio però necessita di una ulteriore definizione ad inizio programma ovvero CF

quello che sostanzialmente cambia nel mio codice è questo:
COLOR CF(CINT(T(A,B)/7.9))

io voglio che per ogni valore di T(A,B) che mi si presenta corrisponda un determinato numero di modo che quando devo stampare il valore 219 questo sia collegato alla variabile CF del COLOR con il valore 2, COLOR 2 ovvero verde.
la definizione è questa:
CF(28)=2
CF(22)=13
CF(30)=11
CF(23)=14
CF(02)=12
CF(01)=15
CF(26)=9

perché CF(28), CF(22)... ?
Ad inizio programma è necessario definire le dimensioni massime degli ARRAY, in GW BASIC normalmente settati a 10.
DIM T(23,41),CF(30)
Questa definizione alloca già la memoria necessaria a queste variabili e la riempie di zeri, questo per evitare che durante l'esecuzione il programma non si debba trovare ad immagazzinare un nuovo valore per una variabile e non avere più memoria, il dannato "out of memory" error.
NOTA, ogni variabile non definita ha valore ZERO. Se si vuole che una certa variabile cominci con ZERO è inutile definirla, si risparmia così codice e memoria.

Qui entra in scena il trucco di dividere per 7.9, un valore non a caso ed è il più alto che mi sono potuto permettere.

l'assegnazione delle variabili CF senza questo trucco sarebbe stata:
CF(219)=2 (ricordate l'associazione che devo fare 219 - 2?)
CF(176)=13
CF(237)=11
CF(178)=14
CF(015)=12
CF(008)=15
CF(206)=9

avrei dovuto quindi definire come dimensione massima dell'ARRAY almeno il valore massimo di CF ovvero 237.
Ma ciò avrebbe comportato tanta memoria sprecata (per ogni posizione dell'array il GWBASIC richiede 4Bytes, quindi quasi 1KB a fronte di sole 7 posizioni occupate realmente nell'array).
NOTA 1: GW BASIC alloca lo stesso anche tutte le altre variabili mancanti tipo CF(1) o CF(100) anche se non le utilizzi
NOTA 2: Essendo 60300Bytes la memoria che può gestire il GW BASIC, Il valore massimo definibile per un array è DIM A(15071) (ma lascerebbe soli 3 Bytes per il programma).

Da qui la divisione per 7.9 (il valore più vicino al valore minimo dei valori che mi servono, che è 8).
La funzione CINT è come INT ma arrotonda all'INTero più vicino, mentre INT all'intero più basso. Se il risultato è 1,6 INT lo arrotonda a 1, mentre CINT a 2.
Ho usato CINT per via del fatto che ho due valori nell'array molto vicini (176 e 178) che se divisi per 8 danno la stessa cifra, mentre con CINT e dividendo per 7.9 danno rispettivamente 22 e 23.

Tirando le somme, mi sono dilungato anche troppo, la nuova funzione di stampa della mappa dura ora 1.4 secondi, sempre su stesso hardware 386.
Lo si nota anche via PCBASIC. Meno su GWBASIC sotto dosbox, lì è istantaneo.

Alla prossima!

Inviato da: TheRuleril 12 Oct 2021, 12:10

Oggi un semplice escursus sulla stampa a schermo ripetitiva grazie al ciclo FOR:NEXT.

Per stampare una lista di elementi a schermo sarebbe sufficiente:

CODICE
10 PRINT"Contadini"
20 PRINT"Vassalli"
30 PRINT"Nobili"

o più semplicemente in una sola riga:

CODICE
10 PRINT"Contadini":PRINT"Vassalli":PRINT"Nobili"


si avrà a schermo il seguente output:

CODICE
Contadini
Vassalli
Nobili


Quando gli elementi sono immagazzinati come variabili o costanti si possono stampare così:

CODICE
10 P(1)="Contadini":P(2)="Vassalli":P(3)="Nobili"
20 FOR A=1 TO 3:PRINT P(A):NEXT

e l'output sarà lo stesso.

E' possibile anche stamparli in posizioni predefinite sullo schermo tramite il comando LOCATE Y,X dove Y è la riga (1-24) e X la colonna (1,80):

CODICE
10 P(1)="Contadini":P(2)="Vassalli":P(3)="Nobili"
20 FOR A=1 TO 3:LOCATE A+2,1:PRINT P(A):NEXT


Verranno stampate sempre all'inizio (,1) delle righe 3, 4 e 5 (A+2).

E' possibile stamparle anche sulla stessa linea:
CODICE
10 PRINT"Contadini";:PRINT" ";:PRINT"Vassalli";:PRINT" ";:PRINT"Nobili"

Contadini Vassalli Nobili


Se le stringhe non fossero sempre della stessa lunghezza e le si volesse stampate sempre nella setssa posizione sullo schermo si può ricorrere alla "virgola":
CODICE
10 PRINT"Contadini","Vassalli","Nobili"

Contadini      Vassalli         Nobili


Se si preferisono posizioni diverse e non fisse come con la virgola, si può usare il più versatile TAB(XX) XX = colonna:

CODICE
10 PRINT TAB(10)"Contadini"TAB(30)"Vassalli"TAB(50)"Nobili"

        Contadini          Vassalli            Nobili



L'unica differenza tra questi comandi è che solo con il LOCATE è possibile mantenere tutto quello che è stato scritto prima a schermo negli spazi, la virgola e il TAB cancellano tutto quello che li divide.

Dunque la faccenda si complica se dobbiamo aggiornare variabili in mezzo a caratteri che non volgiamo spariscano, come nel caso del riepilogo in cima allo schermo:

CODICE
╔═╦ acri ╦ moggi ╔ fiorini╔═ contadini ╦ vassalli ═╦═ nobili ╦═╦═╦ sol ╦ pop ╦═╗
╠╦╩ 1385 ╩ 913  ═╩ 50  ╔═╦╩╦ 22 ═╩ 60 ═╩ 30 ═╩ 75 ═╩ 8  ═╩ 22 ═╩╦╩ 53 ═╩ 150 ╚╦╣
╠╩╦ 75  ╩╦╩   buona   ╦╩╦╩╦╩ pacifici  ╦ pacifici  ╦ pacifici  ╦╩╦  ESTATE   ╦╩╣
╚═╩════╩═╩═╩══════════╩═╩═╩═╩════════╩═╩═════════╩═╩═════════╩═╩═╩═╩═══════╩═╩═╝


il morale può avere 5 diversi stati di lunghezza variabile così come i valori numerici che cambiano di continuo.
La difficoltà sta nel trovare una formula che come risultato dia le esatte posizioni volute.
Nel caso del morale mi servivano a partire da 30 e le successive a distanza di 12: 30, 42, 54
Ho dovuto scomporre i tre numeri in componenti fissi per ridurre la variabilità di A e potergli dare la forma che volevo,
CODICE
30  =  1+29  =  A*10 +18 +A*2  =  10 + 18 +2  =  30
42  =  2+40  =  A*10 +18 +A*2  =  20 + 18 +4  =  42
54  =  3+51  =  A*10 +18 +A*2  =  30 + 18 +6  =  54

alla fine questò è il convoluto algoritmo che ho partorito da passare alla colonna del LOCATE (UNA sola formula per TRE posizioni):
CODICE
FOR A=1 TO 3:LOCATE 3,A*10+A*2+18:PRINT MO(A):NEXT


Si può fare in altri modi, ma questo è quello più elegante che ho potuto immaginare.
Alla prossima!

Inviato da: Sambuil 28 Dec 2021, 12:27

Abbiamo fatto sapere anche al resto del mondo, finalmente la news sul nostro sito: https://www.oldgamesitalia.net/notizie/maniero-25-deluxe-e-uscito

Inviato da: TheRuleril 16 Aug 2022, 21:51

In occasione dell'uscita di https://github.com/robhagemans/pcbasic/releases ho aggiornato il pacchetto di Maniero e fixato un paio di vecchi bug e un typo.

CITAZIONE
Changelog Maniero v2.51 DELUXE (26/08/2022)

- Aggiornato PC-Basic alla versione 2.0.6
- Aggiunto A$=INKEY$ all'interno dei cicli FOR/NEXT dedicati alle animazioni (transizioni, morto bruciato e raccolto) come workaround del bug di PC-BASIC #166 (https://github.com/robhagemans/pcbasic/issues/166).
- L'animazione "morto bruciato", se scoperta, non veniva correttamente visualizzata nella sezione "L'arte di Maniero"
- Risolto il bug nel riepilogo di fine partita per cui premere "Vedere la mappa finale" incrementava erroneamente la statistica "felicità del popolo"


Scaricabile al solito posto, https://www.oldgamesitalia.net/traduzioni/maniero-ii-gwbasic.

Fornito da Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)