Pagina 1 di 1

Tool per pulizia set mame

Inviato: 16/10/2017, 22:35
da edge33
Ciao, come ho anticipato a Motoschifo, sto scrivendo a tempo perso (molto perso) un tool per generare liste per i nostri frontend, principalmente hyperspin e Feel.
Il tool si ispira a Mameshrink, di Motoschifo, prenderò la lista delle roms della versione di mame indicata ed evidezierà le roms presenti nella cartella roms di mame. si potrà quindi generare la lista per il frontend desiderato.

documenterò qui il lavoro, ed esporrò i miei dubbi.
Inzio col chiedere, come si fà a verificare che una rom effettivamente è presente nel set, vi posto questo esempio: the simpsons, in un merged set è un solo romset, come faccio a capire quali cloni del set sono presenti?

Re: Tool per pulizia set mame

Inviato: 16/10/2017, 23:01
da motoschifo
Rispondo velocemente io, almeno come farei in un mio programma (e come effettivamente farò prima o poi...)

Leggi l'xml per capire se il romset (simpsons) deve contenere file (nodi "rom").
Se ne trovi significa che dovrà esiste un file simpsons.zip.
Se il gioco è parent ti fermi qui per ora.
Se è clone analizzi anche il parent ed aggiungi gli eventuali file mancanti.
Se è tutto dentro a simpsons.zip, l'unico modo che hai è quello di controllare quali file sono effettivamente dentro allo zip, e li leggi dai nodi rom (non ricordo ora se filtrato per region, comunque sicuramente filtrati).
Poi in realtà dovresti controllare se ci sono device che hanno bisogno di file (device_ref credo) e per ciascuno di essi, sempre nell'xml, verifichi se hanno nodi "rom".

Il calcolo del sito lavora in quel modo per dirti quali file sono necessari, anche se non fa distinzione tra i diversi tipi di set.
In aggiunta controllo anche i chd, i sample e i bios (identica cosa per i cloni).

Esistono poi anche attributi come romof che indicano di utilizzare un'altra rom.

Scritto (velocemente) credo sia tutto.
Visto che queste letture sono lentissime, utilizza cache ed array in memoria per fare i lavori altrimenti il programma ci metterà una vita ad analizzare il disco...

Preciso una cosa: tutto ciò che so del Mame è arrivato da esperienza diretta. Quasi mai ho avuto info dettagliate da altri programmatori, quindi parti dall'xml e analizzalo per bene leggendo la parte iniziale (dtd) per capire i legami dei nodi.
Considera anche che differenti release del Mame possono usare differenti xml o non contenere affatto alcuni nodi.
Per semplificare le cose potresti far scegliere il tipo di set (merged/splitted/non-merged) oppure proporre tu la modalità di lavoro più adatta.

Ovviamente se trovi qualcosa di interessante scrivilo così potrò farne tesoro per il prossimo shrink. Uscirà probabilmente nel periodo febbraio-aprile 2018 e farà controlli a livello di file dentro agli zip, quasi come un ClrMamePro ;)

Re: Tool per pulizia set mame

Inviato: 17/10/2017, 0:16
da edge33
mmm grazie Motoschifo.
Penso di ignorare per ora i device, mi concentro solo sulle rom... vorrei evidenziare quelle presenti nella lista data dall'xml del mame.
Sto scrivendo in C# su WFP, quindi carico tutto in memoria con una gerarchia di oggetti contenenti array associativi, a parte la lettura iniziale del file, il calcolo diventa quindi abbastanza rapido. Intendo dire, nella peggiore delle ipotesi, penso che la complessità rimanga in ogni caso lineare. Iterare la lista di set e iterare per ogni set le rom confrontando con le rom di un altro set. Le rom per ogni set sono poche e il confronto viene fatto in modo costante con array associativi.


ti trovi su questo discorso? mi sono spiegato?

Re: Tool per pulizia set mame

Inviato: 17/10/2017, 0:47
da motoschifo
Io ho scelto Winform perchè WPF proprio non mi piace, ed alla fine la programmazione (per me) deve essere piacevole altrimenti non va bene <-thumbup->

Nel mio piccolo tool avevo pensato di caricare tutto in una listview ma poi ho dovuto ripiegare con array in memoria, perchè altrimenti in caso di 30 mila giochi tutto diventava molto (troppo) lento.
Una volta che hai letto l'xml dovresti avere tutto il necessario.
Cercare in memoria ha tempi molto rapidi quindi non mi aspetto grandi problemi.

Se vedi che hai rallentamenti, salvati anche le info che calcoli man mano che l'utente rimuove o seleziona qualcosa.
Per es. tutto il discorso di quali file compaiono dove (quindi cosa serve ad un romset) puoi memorizzarlo nell'array e tenerlo buono se dovesse servirti ancora.

Per fare le liste Feel (formato MameWah, estensione lst) ti posto qui di seguito il codice sorgente di quello che faccio sul sito. E' abbastanza leggibile, qualche funzione e la maggior parte dei dati arriva sempre dall'xml. Considera che qui ci sono dati per qualsiasi release del Mame, quindi alcuni valori ormai non li trovi più nelle ultime release.

Codice: Seleziona tutto

case "lst":
	/*
	 * Formato MameWah da 13 righe per ogni gioco, senza alcuna descrizione del campo:
	 * 	 1. name          3wonders
		 2. description   Three Wonders (World 910520)
		 3. year          1991
		 4. manufacturer  Capcom
		 5. cloneof       
		 6. romof         
		 7. screen        raster
		 8. orientation   Horizontal
		 9. input         joy8way - 2P - 3Bt
		10. status        good
		11. color         good
		12. sound         good
		13. category      
	 */
	if ($count==1) {
		$ftitle = utility::get_valid_filename($titolo.".lst");
	}
	// 1. name
	fwrite($f, format::remove_line_breaks($mame->game_name).$EOL);
	// 2. description
	fwrite($f, format::remove_line_breaks($mame->game_description).$EOL);
	// 3. year
	fwrite($f, format::remove_line_breaks($mame->game_year).$EOL);
	// 4.manufacturer
	fwrite($f, format::remove_line_breaks($mame->manufacturer).$EOL);
	// 5. cloneof
	fwrite($f, format::remove_line_breaks($mame->game_cloneof).$EOL);
	// 6. romof
	fwrite($f, format::remove_line_breaks($mame->game_romof).$EOL);
	// 7. screen: raster/vector/lcd/unknown
	fwrite($f, $mame->display_type_desc().$EOL);
	// 8. orientation: Horizontal/Vertical
	fwrite($f, $mame->screen_orientation_desc().$EOL);
	// 9. input: joy8way - 2P - 3Bt
	fwrite($f, format::remove_line_breaks(
		$mame->control_type_ways_desc_feel().
		" - {$mame->input_players}P".
		" - {$mame->input_buttons}Bt").
		$EOL
	);
	// 10. status
	fwrite($f, $mame->status_desc_feel($mame->driver_status,"").$EOL);
	// 11. color
	fwrite($f, $mame->status_desc_feel($mame->driver_color,"").$EOL);
	// 12. sound
	fwrite($f, $mame->status_desc_feel($mame->driver_sound,"").$EOL);
	// 13. category
	fwrite($f, format::remove_line_breaks($categorie->descrizione($mame->category, true)).$EOL);
	break;
	...
	...
	
	
function control_type_ways_desc_feel() {
	$ret = "";
	$types = split(";",$this->control_type.";");
	$ways = split(";",$this->control_ways.";");
	for ($i=0; $i<count($types); $i++) {
		$t = trim($types[$i]);
		if ($t=="") continue;
		$w = "";
		if (isset($ways[$i])) $w = trim($ways[$i]);
		$s = "";
		if ($t==database_adb_mame::CONTROL_TYPE_JOY && $w==database_adb_mame::CONTROL_WAYS_VERTICAL_2) {
			$s = "vjoy2way";
		}
		elseif ($t==database_adb_mame::CONTROL_TYPE_DOUBLEJOY && $w==database_adb_mame::CONTROL_WAYS_VERTICAL_2) {
			$s = "vdoublejoy2way";
		}
		else {
			switch ($t) {
				case self::CONTROL_TYPE_DIAL:			$s = "dial"; break;
				case self::CONTROL_TYPE_DOUBLEJOY:		$s = "doublejoy"; break;
				case self::CONTROL_TYPE_GAMBLING:		$s = "gambling"; break;
				case self::CONTROL_TYPE_HANAFUDA:		$s = "hanafuda"; break;
				case self::CONTROL_TYPE_JOY:			$s = "joy"; break;
				case self::CONTROL_TYPE_KEYBOARD:		$s = "keyboard"; break;
				case self::CONTROL_TYPE_KEYPAD:			$s = "keypad"; break;
				case self::CONTROL_TYPE_KEYPAD:			$s = "keypad"; break;
				case self::CONTROL_TYPE_LIGHTGUN:		$s = "lightgun"; break;
				case self::CONTROL_TYPE_MAHJONG:		$s = "mahjong"; break;
				case self::CONTROL_TYPE_MOUSE:			$s = "mouse"; break;
				case self::CONTROL_TYPE_PADDLE:			$s = "paddle"; break;
				case self::CONTROL_TYPE_PEDAL:			$s = "pedal"; break;
				case self::CONTROL_TYPE_POSITIONAL:		$s = "positional"; break;
				case self::CONTROL_TYPE_STICK:			$s = "stick"; break;
				case self::CONTROL_TYPE_TRACKBALL:		$s = "trackball"; break;
				case self::CONTROL_TYPE_TRIPLEJOY:		$s = "triplejoy"; break;
				case self::CONTROL_TYPE_ONLY_BUTTONS:	$s = "only_buttons"; break;
			}
			switch ($w) {
				case database_adb_mame::CONTROL_WAYS_1: 			$s .= "1way"; 	break;	// 1
				case database_adb_mame::CONTROL_WAYS_2: 			$s .= "2way"; 	break;	// 2
				case database_adb_mame::CONTROL_WAYS_3_HALF_4: 		$s .= "3way"; 	break;	// 3 (half4)
				case database_adb_mame::CONTROL_WAYS_4: 			$s .= "4way"; 	break;	// 4
				case database_adb_mame::CONTROL_WAYS_5_HALF_8: 		$s .= "5way"; 	break;	// 5 (half8)
				case database_adb_mame::CONTROL_WAYS_8: 			$s .= "8way"; 	break;	// 8
				case database_adb_mame::CONTROL_WAYS_VERTICAL_2: 	$s .= "2way"; 	break;	// vertical2
				case database_adb_mame::CONTROL_WAYS_STRANGE2: 		$s .= "2way"; 	break;	// strange2
				case database_adb_mame::CONTROL_WAYS_16:	 		$s .= "16way"; 	break;	// 16
				default:
					if ($w!="" && $w!=0) $s .= "{$w}way";
					break;
			}
		}
		if ($s=="") continue;
		if ($ret!="") $ret .= ",";
		$ret .= $s;
	}
	return $ret;
}

function display_type_desc($not_found="") {
	switch ($this->display_type) {
		case self::DISPLAY_TYPE_RASTER: 	return "raster";
		case self::DISPLAY_TYPE_VECTOR: 	return "vector";
		case self::DISPLAY_TYPE_LCD: 		return "lcd";
		case self::DISPLAY_TYPE_UNKNOWN:	return "unknown";
	}
	return $not_found;
}

function screen_orientation_desc() {
	switch ($this->screen_orientation) {
		case self::SCREEN_ORIENTATION_ORIZZONTALE: 	return "Horizontal";
		case self::SCREEN_ORIENTATION_VERTICALE: 	return "Vertical";
		case self::SCREEN_ORIENTATION_NESSUNO: 		return "";
	}
	return "";
}

Re: Tool per pulizia set mame

Inviato: 17/10/2017, 16:38
da edge33
quindi penso che convenga creare un modello nell'applicazione per avere la lista di oggetti che mappano i set e contengono mappe di roms in modo da fare controlli costanti per ogni rom, sei d'accordo?

Re: Tool per pulizia set mame

Inviato: 17/10/2017, 18:33
da motoschifo
Si dovresti creare strutture con i riferimenti e le info necessarie, così da non dover continuamente accedere all'xml.
Puoi eventualmente anche partire dai file su disco perchè se manca qualcosa di sicuro non potrai avere la lista funzionante sul front-end.

Re: Tool per pulizia set mame

Inviato: 19/08/2018, 18:15
da alucard
Scusa @motoschifo,
mi sono avvicinato da poco alla gestione delle rom di Mame.

Considerando come versione di riferimento del mame la 0.200, ho scaricato le rom che mi interessavano da https://www.retroroms.info e leggendo qui e la, ho deciso di utilizzare ClrMamePro per verificarle e per gestire magari in futuro delle integrazioni.

ClrMamePro non restringe però la verifica alle rom in mio possesso, quindi il processo, oltre ad essere lungo, alla fine non mi da neanche evidenza di quello che ho e che manca. Inoltre tutti i set li considera giustamente incompleti, visto che di ogni gioco ho solo il parent e tranne eccezioni avrò solo quelli.

Se ho ben capito Mame Shrink serve proprio a questo scopo, giusto?
In tal caso, è previsto che lavori con un file .dat anziché con l'eseguibile del Mame? Io non uso il Mame classico, ma il core da Retroarch.

Grazie

Re: Tool per pulizia set mame

Inviato: 19/08/2018, 18:20
da Tox Nox Fox
No
ClrMamePro controlla e verifica le tue roms in base al dat che gli dai
MameShrink permette di eliminare e ripulire il tuo romset
Se vuoi usare ClrMamePro per il controllo con solo parent ( ad esempio ) devi crearti un dat da dargli usando ArcadeDataBase
Selezionado i criteri di ricerca puoi farti un dat per il ClrMamePro con, ad esempio, Solo Parent + Solo Funzionanti + No Videopoker + No Mechanical + No Flipper + No Trackball + ecc ecc

Oppure lo crei con tutti i parent e poi lo scremi con MameShrink

Hai letto qui -> Come crearsi un Romset Personalizzato per una versione di Mame

Re: Tool per pulizia set mame

Inviato: 09/09/2018, 19:59
da assoxcs
Grazie