Tool per pulizia set mame

Problemi e soluzioni su configurazioni software, firmware
Avatar utente
edge33
Affezionato
Affezionato
Messaggi: 113
Iscritto il: 05/05/2017, 12:46
Città: Rende

Tool per pulizia set mame

Messaggio 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?
Avatar utente
motoschifo

Gold Medal Donatore
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 3271
Iscritto il: 12/07/2013, 20:29
Medaglie: 2
Città: Parma
Località: Parma
Grazie Inviati: 32 volte
Grazie Ricevuti: 31 volte
Contatta:

Re: Tool per pulizia set mame

Messaggio 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 ;)
Motoschifo
CAB ›MameOriz ›MameVert ›PCB ›NeoGeo ›TopDrive ›Tekken3 Wishlist ›PacMan ›Arkanoid
Flipper ›HighSpeed Wishlist ›MedievalMadness ›MonsterBash ›HighSpeed2 WebArcadeDatabase
Avatar utente
edge33
Affezionato
Affezionato
Messaggi: 113
Iscritto il: 05/05/2017, 12:46
Città: Rende

Re: Tool per pulizia set mame

Messaggio 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?
Avatar utente
motoschifo

Gold Medal Donatore
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 3271
Iscritto il: 12/07/2013, 20:29
Medaglie: 2
Città: Parma
Località: Parma
Grazie Inviati: 32 volte
Grazie Ricevuti: 31 volte
Contatta:

Re: Tool per pulizia set mame

Messaggio 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 "";
}
Motoschifo
CAB ›MameOriz ›MameVert ›PCB ›NeoGeo ›TopDrive ›Tekken3 Wishlist ›PacMan ›Arkanoid
Flipper ›HighSpeed Wishlist ›MedievalMadness ›MonsterBash ›HighSpeed2 WebArcadeDatabase
Avatar utente
edge33
Affezionato
Affezionato
Messaggi: 113
Iscritto il: 05/05/2017, 12:46
Città: Rende

Re: Tool per pulizia set mame

Messaggio 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?
Avatar utente
motoschifo

Gold Medal Donatore
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 3271
Iscritto il: 12/07/2013, 20:29
Medaglie: 2
Città: Parma
Località: Parma
Grazie Inviati: 32 volte
Grazie Ricevuti: 31 volte
Contatta:

Re: Tool per pulizia set mame

Messaggio 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.
Motoschifo
CAB ›MameOriz ›MameVert ›PCB ›NeoGeo ›TopDrive ›Tekken3 Wishlist ›PacMan ›Arkanoid
Flipper ›HighSpeed Wishlist ›MedievalMadness ›MonsterBash ›HighSpeed2 WebArcadeDatabase
Avatar utente
alucard

Donatore
Affezionato
Affezionato
Messaggi: 277
Iscritto il: 02/12/2017, 16:19
Medaglie: 1
Città: Ceprano
Grazie Inviati: 5 volte
Grazie Ricevuti: 15 volte

Re: Tool per pulizia set mame

Messaggio 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
Avatar utente
Tox Nox Fox

BanHammer Silver Medal Donatore
Moderatore
Moderatore
Messaggi: 11713
Iscritto il: 14/01/2007, 23:35
Medaglie: 3
Grazie Inviati: 159 volte
Grazie Ricevuti: 270 volte

Re: Tool per pulizia set mame

Messaggio 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
WP.ARCADEITALIA.NET
La Guida al MameCab
assoxcs
Newbie
Newbie
Messaggi: 60
Iscritto il: 30/07/2018, 16:11
Città: monza

Re: Tool per pulizia set mame

Messaggio da assoxcs »

Grazie
Rispondi

Torna a “Miscellanea software”