Tool per pulizia set mame

Problemi e soluzioni su configurazioni software, firmware
Avatar utente
edge33
Affezionato
Affezionato
Messaggi: 111
Iscritto il: 05/05/2017, 11:46
Reputation: 0
Città: Rende

Tool per pulizia set mame

Messaggio da edge33 » 16/10/2017, 21:35

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
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 2423
Iscritto il: 12/07/2013, 19:29
Medaglie: 2
Reputation: 42
Città: Parma
Località: Parma
:
Gold Medal Donatore
Contatta:

Re: Tool per pulizia set mame

Messaggio da motoschifo » 16/10/2017, 22:01

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: 111
Iscritto il: 05/05/2017, 11:46
Reputation: 0
Città: Rende

Re: Tool per pulizia set mame

Messaggio da edge33 » 16/10/2017, 23:16

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
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 2423
Iscritto il: 12/07/2013, 19:29
Medaglie: 2
Reputation: 42
Città: Parma
Località: Parma
:
Gold Medal Donatore
Contatta:

Re: Tool per pulizia set mame

Messaggio da motoschifo » 16/10/2017, 23:47

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: 111
Iscritto il: 05/05/2017, 11:46
Reputation: 0
Città: Rende

Re: Tool per pulizia set mame

Messaggio da edge33 » 17/10/2017, 15:38

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
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 2423
Iscritto il: 12/07/2013, 19:29
Medaglie: 2
Reputation: 42
Città: Parma
Località: Parma
:
Gold Medal Donatore
Contatta:

Re: Tool per pulizia set mame

Messaggio da motoschifo » 17/10/2017, 17:33

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


Rispondi