From e2808c70060487ba3064d47db9588363a2cdf75e Mon Sep 17 00:00:00 2001 From: Daniel Brooks Date: Sun, 10 Feb 2019 20:42:58 -0800 Subject: [PATCH] support loading np2, xmil, and vmac items from IA --- loader.js | 139 +++++++++++++++++++++++++++++++- other_logos/nekop2.gif | Bin 0 -> 1143 bytes other_logos/vmac.png | Bin 0 -> 9922 bytes other_logos/xmillenium_logo.jpg | Bin 0 -> 5933 bytes 4 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 other_logos/nekop2.gif create mode 100644 other_logos/vmac.png create mode 100644 other_logos/xmillenium_logo.jpg diff --git a/loader.js b/loader.js index eb8181e5..32bf29a3 100644 --- a/loader.js +++ b/loader.js @@ -59,7 +59,10 @@ var Module = null; dosbox: img("/images/dosbox.png"), sae: img("/images/sae.png"), pce: img("/images/pce.png"), - vice: img("/images/vice.svg") + vice: img("/images/vice.svg"), + np2: img("/images/nekop2.gif"), + xmil: img("/images/xmillenium_logo.jpg"), + vmac: img("/images/vmac.png"), }; } else { images = { ia: img("other_logos/ia-logo-150x150.png"), @@ -68,7 +71,10 @@ var Module = null; dosbox: img("other_logos/dosbox.png"), sae: img("other_logos/sae.png"), pce: img("other_logos/pce.png"), - vice: img("other_logos/vice.svg") + vice: img("other_logos/vice.svg"), + np2: img("other_logos/nekop2.gif"), + xmil: img("other_logos/xmillenium_logo.jpg"), + vmac: img("other_logos/vmac.png"), }; } @@ -161,6 +167,21 @@ var Module = null; cfgr = VICELoader; get_files = get_vice_files; } + else if (module && module.indexOf("np2-") === 0) { + emulator_logo = images.np2; + cfgr = NP2Loader; + get_files = get_np2_files; + } + else if (module && module.indexOf("xmil-") === 0) { + emulator_logo = images.xmil; + cfgr = NP2Loader; + get_files = get_xmil_files; + } + else if (module && module.indexOf("vmac-") === 0) { + emulator_logo = images.vmac; + cfgr = NP2Loader; + get_files = get_vmac_files; + } else if (module) { emulator_logo = images.mame; cfgr = MAMELoader; @@ -214,6 +235,16 @@ var Module = null; } else if (module && module.indexOf("sae-") === 0) { config_args.push(cfgr.model(modulecfg.driver), cfgr.rom(modulecfg.bios_filenames)); + } else if (module && (module.indexOf("np2-") == 0 || + module.indexOf("xmil-") == 0 || + module.indexOf("vmac-") == 0)) { + let emulator_start_item = metadata.getElementsByTagName("emulator_start"); + console.log(emulator_start_item); + if (!emulator_start_item) { + throw new Exception("Error: this item does not have an 'emulator_start' metadata value; I don't know what to run."); + } + config_args.push(cfgr.autoLoad('/emulator/'+ emulator_start_item.item(0).textContent), + cfgr.extraArgs(modulecfg.extra_args)); } else if (module && module.indexOf("pce-") === 0) { config_args.push(cfgr.model(modulecfg.driver), cfgr.extraArgs(modulecfg.extra_args)); @@ -441,6 +472,102 @@ var Module = null; get_other_emulator_config_url("pce-"+ modulecfg['driver'])))); return files; } + + // TODO(db48x): get_{np2,xmil,vmac}_files are even more + // duplicative than the rest; time to factor this a lot + function get_np2_files(cfgr, metadata, modulecfg, filelist) { + var files = [], + bios_files = modulecfg['bios_filenames']; + bios_files.forEach(function (fname, i) { + if (fname) { + var title = "ROM File ("+ (i+1) +" of "+ bios_files.length +")", + mounter = (fname.endsWith(".zip")) ? cfgr.mountZip + : cfgr.mountFile; + files.push(mounter('np2', + cfgr.fetchFile(title, get_bios_url(fname)))); + } + }); + var meta = dict_from_xml(metadata), + peripherals = {}, + game_files_counter = {}; + files_with_ext_from_filelist(filelist, meta.emulator_ext).forEach(function (file, i) { + game_files_counter[file.name] = 1; + }); + + var game_files = Object.keys(game_files_counter), + len = game_files.length; + game_files.forEach(function (filename, i) { + var title = "Game File ("+ (i+1) +" of "+ len +")", + url = (filename.includes("/")) ? get_zip_url(filename) + : get_zip_url(filename, get_item_name(game)); + files.push(cfgr.mountFile('/'+ filename, + cfgr.fetchFile(title, url))); + }); + return files; + } + + function get_xmil_files(cfgr, metadata, modulecfg, filelist) { + var files = [], + bios_files = modulecfg['bios_filenames']; + bios_files.forEach(function (fname, i) { + if (fname) { + var title = "ROM File ("+ (i+1) +" of "+ bios_files.length +")", + mounter = (fname.endsWith(".zip")) ? cfgr.mountZip + : cfgr.mountFile; + files.push(mounter('xmil', + cfgr.fetchFile(title, get_bios_url(fname)))); + } + }); + var meta = dict_from_xml(metadata), + peripherals = {}, + game_files_counter = {}; + files_with_ext_from_filelist(filelist, meta.emulator_ext).forEach(function (file, i) { + game_files_counter[file.name] = 1; + }); + + var game_files = Object.keys(game_files_counter), + len = game_files.length; + game_files.forEach(function (filename, i) { + var title = "Game File ("+ (i+1) +" of "+ len +")", + url = (filename.includes("/")) ? get_zip_url(filename) + : get_zip_url(filename, get_item_name(game)); + files.push(cfgr.mountFile('/'+ filename, + cfgr.fetchFile(title, url))); + }); + return files; + } + + function get_vmac_files(cfgr, metadata, modulecfg, filelist) { + var files = [], + bios_files = modulecfg['bios_filenames']; + bios_files.forEach(function (fname, i) { + if (fname) { + var title = "ROM File ("+ (i+1) +" of "+ bios_files.length +")", + mounter = (fname.endsWith(".zip")) ? cfgr.mountZip + : cfgr.mountFile; + files.push(mounter('minivmac', + cfgr.fetchFile(title, get_bios_url(fname)))); + } + }); + var meta = dict_from_xml(metadata), + peripherals = {}, + game_files_counter = {}; + files_with_ext_from_filelist(filelist, meta.emulator_ext).forEach(function (file, i) { + game_files_counter[file.name] = 1; + }); + + var game_files = Object.keys(game_files_counter), + len = game_files.length; + game_files.forEach(function (filename, i) { + var title = "Game File ("+ (i+1) +" of "+ len +")", + url = (filename.includes("/")) ? get_zip_url(filename) + : get_zip_url(filename, get_item_name(game)); + files.push(cfgr.mountFile('/'+ filename, + cfgr.fetchFile(title, url))); + }); + return files; + } + var get_item_name = function (game_path) { return game_path.split('/').shift(); }; @@ -737,9 +864,17 @@ var Module = null; /** * NP2Loader + * + * TODO(db48x): This is currently doing triple-duty as the loader + * for the xmil and vmac emulators as well. Investigate to see if it + * would be better to split them out. Since all three are by the + * same author, it may simply be better to rename it instead. */ function NP2Loader() { var config = Array.prototype.reduce.call(arguments, extend); + if (!config.emulatorStart) { + throw new Error("You must specify an autoLoad value in order to start this emulator. Try the name of the disk image."); + } config.emulator_arguments = build_np2_arguments(config.emulatorStart, config.files, config.extra_np2_args); config.runner = NP2Runner; return config; diff --git a/other_logos/nekop2.gif b/other_logos/nekop2.gif new file mode 100644 index 0000000000000000000000000000000000000000..55aae844570c7dd926981cbdcf72d6a945227747 GIT binary patch literal 1143 zcmV--1c>`bNk%w1Vf+9b0J8u90002i*4EzE-rnBc=icY%=jZR|@9*#L_wV=j_xJzz z|NsC0000000000000000A^8LW000XBEC2ui0Q>+P000F4aLGxly*TU5yRXS7j$~<` zr!f?0>%LYJ7$ICLcCL3x5&VXoa99Zp76}1yBU3I#heGXnLHq&-U1Caw5dxC{qB|i7 zLWTfq$K`#EZSpm4N?!v6^2>*lW%Ua`Xn!^bSA-sKVjYTij*l8wEeQt$k3UC%Bm-lC zcRC0L28b1gokDh46F!+3hCiejm$P@L7C(6?jsvNJnoI`-mRGq4qa+158NUA?hVxxpZ8WLp70y2caTpeQR z0Z;)zIRR1@0H8@wlJ&yQEjyJdldy&DS)Lx=PH~F2#MA(D7f1wC72k-XC@b{pis?tk zpFhHq)|1w8s!=7fd=yk9^(w!*2w3dItJ zVO3q%0Y>kww_KU}a_49_BR@U;IDh@gL1&-;1#fjWU;@Eqb5#WzrBwklOhm@a0O^G> z+XA(1AW(~v@%tw!h6!3@@E(IKbfC6Gp0FQVpMrj{_C|ZX{mQz+|=yF!dXx1Ao5F<{G7&h}} z5#{Mwlte~KN`adq^pL}7BO(eYXZ+Pj=w@bRma2(akcu6nCqTFzNm}K(shX9l2gWOz za;oKID6r-0q!w7QMNOlDz?PhBUMRxo31f~Fdy!7O(mbL)#&jFI^=^hQ1}WLjy@Gbz2 z2k066Ewyf1`&}+~5Ml{r7Edrtcym$m@xXKy{DFcH8Kd$s7bs8w0)yph!2sk0N6WwL z0y!tWX}Y=QGD})AMK(R((;FZkl|TSY`&<(6cn8C2!Al=BBwNKYQ?TK8n0R$`r1!Y{ zgd*ZC@rbQ0UlE={ziB}B2u69(LjljIGuR3R97O3=3N*sP8|kSuOHPv=AOJ5ME^!kH zWzQ-=0yo%-yw J*RDeZ06WQ8`#Asr literal 0 HcmV?d00001 diff --git a/other_logos/vmac.png b/other_logos/vmac.png new file mode 100644 index 0000000000000000000000000000000000000000..8c178633cf10b14504dabecb0326cf506aada471 GIT binary patch literal 9922 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 z zi}G_6o8v`sZH~?tMKtu{Ywv8fV3vru&mFh8;x4jm!|NTM4v{DU8gOH#q;;N669vA} z`3Ng))K5PUdvanJE#p(c4vkLN44$>lu6pNrsSXkN5PDd4{rXv4di+v_eX$l%{bkK} zY^<{cGZ~%nAMxM+1aS_bxK6V={W$s6iGK5}wX=WX(OtVce!bpUd;<%%j}K5N_!a&U zU9c3(BwUnndluV# zw*C|M@_0S>MHFw$Vs=@eVd#F7+^Qb~73ta1^?Gk?bY0PR>g#1Fge2n?S&{`V_P(W} z35PerzuL>W++-uyA)I#neH!y%-^8o0jYq5&-LiH{mWd$x=6vL(|4W$7UwJCxE@jSY z0eV?(Vh?K;aQ&naXFxuRQoWa#yT_H~=}cGWe5Un>!IU|%&V)7s!jGY+>p3pAZZk61 z)R%Cr_gI>GJ8)+lTkcaovhhUpbD>H8$?fIEu4ON?XbuMPB2Ld;7g_1&_$W zGpIk}rA_v81S)$fbH+>qnvp@Tq&*BuH)J<9*Xzi%-SrsN^vuLQ(Cs7fpN&! z%t{fzXF@EG&w>74=YbwweM$Tk{Gv5=GCwELF5x9S`|?OPx;1>Ut|hy)z18}?Z*Ua) z#}j@R|AcS$=c4$hsx0#IH>P>H9_-#IuC*>#R#6eDmLvFyU8nHLwiEN<7x7 zyrX%si{t9J6@Pb;>@Ka&jsZO}$?34nu;op9vdyZJQ~=fTZ|pz`)%J_+ zgS$WacEVf(adKDxuFv=$7m~l9jy8rCk1QNUvJbaDjQ>?$E(dct8USNdhwXZ9t9Lk{ z@ex&D+j$rMCI=Q@?TKjX>w_+O?!iW2(={wt-#_By9keOFUWuIol<=(?^*>2 zGZajTMe^BH{-S-3RyUZnBBqlKNcLT7wvJ8obZ<~#A!+>hPE8~zmEpzoGbB4dzjYi{{jD$OmH!!4FGaZ0Ui5aJaInSE$1ZWhFZuedfL0O z1n+JZ0rg&g#_s{iOU;d+&7Ab^*mMM73H_F?8#NKaoHe0Nsc3=t-h+qMHh-=X2b~+; z_%)Qxxn@I}eqxs;qjqC@ul*#}!9J)tK+CB-MIQ$(|G>!LwXh=9f$+75S)z419X>92d!H2; z^hM3Ivw|)D?H*&zGG-0Ohd0>yEdt_@*0?R^X30TjC|01T!g|765=2HAGj|3Q=l4 zIx?0T)etuc7g358z#T$uD<>g#N#SWdtxD08~1^Fg* zdS3x@#r=g(4s>;OHBC$?>V4TzPgD$JFlsW$1f1vBnr)Iz`HLJA$c5hIm56aO{72~G zI^4-UXR(unhKtG&T+u};rr2&0o1I(}B7Vx8-!@t2gD5v66Na?wA!08v#0eQA zO6i-}e#itNFLd|o!sAPQg_^2}ssz8-FR@zHR&k(8vlQ!C6-}D21=vAiBi&W3yQr1! z8&*2roLeILty_74NiI5OA|q2OoN3#t!f9c1GgaJ03MVb9Br4V^MHYaYrBP&Y)Seq~ zL{YS65HSHpf3F|3m}>ByQcFvV)dW*YpAZ7zHVq8wF{OGH<>Hcxi;L4XG*mLpPq22d zH5K%q0mGa{3A4dpS` zW#tw9{rTI0uP>?M?R-*-qm+}ZYyb@s8XZL?7-a8iel`n1yYFIGDSs}j$ku^bhtgYk zdp$kuW~MXTPMZ)WG=ih!X8sj3Q;B#CX5GZV_{+8iuU#&IokqO1o9y47UBKB zF9B5*75XRc#vdg0&Hx!mCKCXiR@j;XBO7cj` zd@2g(qwT9Wv9&4pD3CaTbfRfTAlOOd6MVf;`xKp zt+1aeGGY4iqpsJi(hpgjmSm44=wuR#0uEU4C*%KjjQ%%U{#QW1qGU_Q35=cuQNDdP OgHx1KldY3B5BV=8{oREC literal 0 HcmV?d00001 diff --git a/other_logos/xmillenium_logo.jpg b/other_logos/xmillenium_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48f582db81e5e368aadcf82abd00f959539ccc11 GIT binary patch literal 5933 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 literal 0 HcmV?d00001