---------------------------------------------------------------- -- MODULE: Jimmy's Jukebox music shuffling ---------------------------------------------------------------- -- -- Copyright (C) 2009 Kate (Pink Silver) -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License -- as published by the Free Software Foundation; either version 2 -- of the License, or (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- ---------------------------------------------------------------- DOOM2_ORIGINAL_MUSIC = { MAP01 = "D_RUNNIN", MAP02 = "D_STALKS", MAP03 = "D_COUNTD", MAP04 = "D_BETWEE", MAP05 = "D_DOOM" , MAP06 = "D_THE_DA", MAP07 = "D_SHAWN" , MAP08 = "D_DDTBLU", MAP09 = "D_IN_CIT", MAP10 = "D_DEAD" , MAP11 = "D_STLKS2", MAP12 = "D_THEDA2", MAP13 = "D_DOOM2" , MAP14 = "D_DDTBL2", MAP15 = "D_RUNNI2", MAP16 = "D_DEAD2" , MAP17 = "D_STLKS3", MAP18 = "D_ROMERO", MAP19 = "D_SHAWN2", MAP20 = "D_MESSAG", MAP21 = "D_COUNT2", MAP22 = "D_DDTBL3", MAP23 = "D_AMPIE" , MAP24 = "D_THEDA3", MAP25 = "D_ADRIAN", MAP26 = "D_MESSG2", MAP27 = "D_ROMER2", MAP28 = "D_TENSE" , MAP29 = "D_SHAWN3", MAP30 = "D_OPENIN", MAP31 = "D_EVIL" , MAP32 = "D_ULTIMA", } MUSICS_TABLE = { DOOM1 = { "D_E1M1", "D_E1M2", "D_E1M3", "D_E1M4", "D_E1M5", "D_E1M6", "D_E1M7", "D_E1M8", "D_E1M9", "D_E2M1", "D_E2M2", "D_E2M3", "D_E2M4", "D_E2M6", "D_E2M7", "D_E2M8", "D_E3M1", "D_E3M2", "D_E3M3", "D_E3M8", "D_BUNNY", "D_VICTOR", }, DOOM2 = { "D_D2_01", "D_D2_02", "D_D2_03", "D_D2_04", "D_D2_05", "D_D2_06", "D_D2_07", "D_D2_08", "D_D2_09", "D_D2_10", "D_D2_18", "D_D2_20", "D_D2_23", "D_D2_25", "D_D2_28", "D_D2_30", "D_D2_31", "D_D2_32", "D_D2_VIC", }, TNT = { "D_TNT_01", "D_TNT_02", "D_TNT_04", "D_TNT_05", "D_TNT_06", "D_TNT_07", "D_TNT_08", "D_TNT_10", "D_TNT_11", "D_TNT_14", "D_TNT_16", "D_TNT_20", "D_TNT_22", "D_TNT_31", }, MM1 = { "D_MM_01", "D_MM_02", "D_MM_03", "D_MM_04", "D_MM_05", "D_MM_06", "D_MM_07", "D_MM_08", "D_MM_09", "D_MM_10", "D_MM_11", "D_MM_12", "D_MM_13", "D_MM_14", "D_MM_15", }, MM2 = { "D_MM2_01", "D_MM2_02", "D_MM2_03", "D_MM2_04", "D_MM2_05", "D_MM2_06", "D_MM2_07", "D_MM2_08", "D_MM2_09", "D_MM2_10", "D_MM2_11", "D_MM2_12", "D_MM2_13", "D_MM2_14", "D_MM2_15", "D_MM2_16", "D_MM2_17", "D_MM2_18", "D_MM2_19", "D_MM2_20", "D_MM2_21", "D_MM2_22", "D_MM2_23", "D_MM2_24", "D_MM2_25", "D_MM2_26", "D_MM2_27", "D_MM2_28", "D_MM2_29", "D_MM2_30", "D_MM2_31", "D_MM2_32", }, REQUIEM = { "D_REQ_01", "D_REQ_02", "D_REQ_03", "D_REQ_04", "D_REQ_05", "D_REQ_06", "D_REQ_07", "D_REQ_08", "D_REQ_09", "D_REQ_10", "D_REQ_11", "D_REQ_12", "D_REQ_13", "D_REQ_14", "D_REQ_15", "D_REQ_16", "D_REQ_17", "D_REQ_18", "D_REQ_19", "D_REQ_20", "D_REQ_21", "D_REQ_24", }, STRAIN = { "D_STR_01", "D_STR_02", "D_STR_03", "D_STR_04", "D_STR_05", "D_STR_06", "D_STR_07", "D_STR_08", "D_STR_09", "D_STR_10", "D_STR_11", "D_STR_12", "D_STR_13", "D_STR_14", "D_STR_16", "D_STR_17", "D_STR_18", "D_STR_19", "D_STR_20", "D_STR_21", "D_STR_26", "D_STR_27", "D_STR_28", "D_STR_30", "D_STR_32", }, HR2 = { "D_HR2_01", "D_HR2_02", "D_HR2_03", "D_HR2_04", "D_HR2_05", "D_HR2_06", "D_HR2_07", "D_HR2_08", "D_HR2_09", "D_HR2_10", "D_HR2_11", "D_HR2_12", "D_HR2_13", "D_HR2_14", "D_HR2_15", "D_HR2_16", "D_HR2_17", "D_HR2_18", "D_HR2_19", "D_HR2_20", "D_HR2_21", "D_HR2_22", "D_HR2_23", "D_HR2_24", "D_HR2_25", "D_HR2_26", "D_HR2_27", "D_HR2_28", "D_HR2_29", "D_HR2_30", "D_HR2_31", "D_HR2_32", }, WOS = { "D_WOS_01", "D_WOS_02", "D_WOS_03", "D_WOS_04", "D_WOS_05", "D_WOS_06", "D_WOS_07", "D_WOS_08", "D_WOS_09", "D_WOS_10", "D_WOS_11", "D_WOS_12", "D_WOS_13", "D_WOS_14", "D_WOS_15", "D_WOS_16", "D_WOS_17", "D_WOS_18", "D_WOS_19", "D_WOS_20", "D_WOS_21", "D_WOS_22", "D_WOS_23", "D_WOS_24", "D_WOS_25", "D_WOS_26", "D_WOS_27", "D_WOS_28", "D_WOS_29", "D_WOS_30", "D_WOS_31", "D_WOS_32", "D_WOS_33", "D_WOS_34", "D_WOS_35", }, JIMMY = { "D_ACTION", "D_AMBNCE", "D_BRGSCH", "D_BIRDS", "D_BOREAL", "D_CURSED", "D_DIMENS", "D_DULCEB", "D_GUARDH", "D_HANGEM", "D_HARBOR", "D_HOLOFE", "D_ICE", "D_PREPAR", "D_SABBAT", "D_STRENG", "D_TECHNO", "D_TERABY", "D_ZDOOM", "D_ADRENA", "D_CRUITH", "D_DEPART", "D_DIAMON", "D_ELECTR", "D_FETIDF", "D_FUNKYS", "D_HATSHP", "D_HAUNTE", "D_HIDDEN", "D_INFERN", "D_INTOFR", "D_MOROSE", "D_PATHOG", "D_PROTOT", "D_REDSHF", "D_RIOTSQ", "D_ROCKMY", "D_SACRIF", "D_SETTLE", "D_SHORTC", "D_SPECTR", "D_THEACE", "D_THBATT", "D_TORQUE", "D_UNDERC", "D_VOYAGE", "D_INSURG", "D_DESPER", "D_CRYPT", "D_ACTSTA", "D_PIPE", "D_FLOOD", "D_STEAM", "D_ENGAGE", "D_MUTATE", "D_FACES", "D_KILLIN", "D_WATERC", "D_SETFIR", "D_CRUSH", "D_UNDERW", "D_WITCHC", "D_CHIMES", "D_CRUSHD", "D_OVERCL", "D_SQUAR", "D_TRILEM", "D_SHROUD", "D_TECHNP", "D_BESIEG", "D_CHERNO", "D_FACING", "D_YAWNIN", "D_EASTER", "D_WRONGT", "D_CANYOU", "D_GRIDLK", "D_MIDNIG", "D_SLEEPI", "D_OASIS", "D_ASTRAL", "D_BATTLE", "D_BECOME", "D_CATACL", "D_CYBERP", "D_DEADLY", "D_NOBODY", "D_PLUTOP", "D_PYRARI", "D_SANCTI", "D_SILICO", "D_SLIMED", "D_WASTEL", "D_BLOODR", "D_CONSTA", "D_DESECR", "D_HORDEL", "D_BARONS", "D_GREATH", "D_RUSTYN", "D_UNKNOW", "D_WARSWO", "D_ALIEN", "D_BLEEDG", "D_DARKMT", "D_FUELED", "D_INVERS", "D_MONSTR", "D_RAWST1", "D_RAWST2", "D_SPLITT", "D_ALICE", "D_WATCHY", "D_BITEFS", "D_FIERYD", "D_HORNET", "D_BUILTK", "D_COLLAP", "D_GATES", "D_INTERL", "D_IRONFI", "D_TEMPER", "D_TRINIT", "D_DREADF", "D_FTHRUS", "D_KILLST", "D_THUNDR", "D_WOLVER", "D_VENTUR", "D_PUSH", "D_HAPPY", "D_WHERE", "D_ISLAND", "D_SUBMIS", "D_BLACKI", "D_TRANSD", "D_COURTD", "D_OCEANM", "D_GRANIT", "D_UNDISC", "D_AIRCHA", "D_DISTAN", "D_PISTON", "D_SUNSET", "D_DISAST", "D_LORDSP", "D_VOLITN", }, FORTYTWO = { "D_AIR", "D_ALIENS", "D_ASH", "D_ASSAUL", "D_BEDTIM", "D_BEHIND", "D_BREEZE", "D_CASTLE", "D_CAVERN", "D_CAVITY", "D_CLIFF", "D_COLDWI", "D_CORE", "D_COURTY", "D_DARKRM", "D_DEEPFO", "D_DREAMA", "D_DRIPS", "D_EDGE", "D_EGYPT", "D_EMPTY", "D_END", "D_FALLOF", "D_FEW", "D_FLEE", "D_FOREST", "D_FORLOR", "D_GARDEN", "D_GATEWA", "D_GETAWA", "D_GHOSTT", "D_GIGABR", "D_GOLDRU", "D_GREATR", "D_GREENH", "D_GROTTO", "D_HARMLE", "D_ICEBRG", "D_IN_SPC", "D_INTRO", "D_ISLGRV", "D_IVY", "D_JAILBR", "D_JOURNE", "D_JUNGLE", "D_LAVA", "D_LEDGE", "D_LINES", "D_LONGNI", "D_METAL", "D_MIST", "D_MORTAR", "D_NIGHTR", "D_OTHERS", "D_PASSAG", "D_PLATFO", "D_PURSUI", "D_RAINFO", "D_REGNLD", "D_RISK", "D_RIVER", "D_ROOF", "D_RUSTYB", "D_SENTIN", "D_SEWERS", "D_SEWCHS", "D_SEWSLD", "D_SIEGE", "D_SKYSCR", "D_SKYTEM", "D_SPACEP", "D_SPACET", "D_STAIRS", "D_STARS", "D_START", "D_SURFAC", "D_TECHBA", "D_TEMPLE", "D_TRAPPE", "D_UNDERG", "D_UNSUCC", "D_VICTRY", "D_WALKTH", "D_WASH", "D_WASTE", "D_WEIRD", "D_WINDIN", "D_WINDOW", "D_YUB", }, HERETIC = { "D_H_E1M1", "D_H_E1M2", "D_H_E1M3", "D_H_E1M4", "D_H_E1M5", "D_H_E1M6", "D_H_E1M7", "D_H_E1M8", "D_H_E1M9", "D_H_E2M1", "D_H_E2M2", "D_H_E2M3", "D_H_E2M4", "D_H_E2M6", "D_H_E2M7", "D_H_E2M8", "D_H_E2M9", "D_H_E3M2", "D_H_E3M3", "D_H_CPTD", }, HEXEN = { "WINNOWR", "JACHR", "SIMONR", "WUTZITR", "FALCONR", "LEVELR", "CHARTR", "SWAMPR", "DEEPR", "FUBASR", "GROVER", "FORTR", "FOOJAR", "SIXATER", "WOBABYR", "CRYPTR", "FANTAR", "BLECHR", "VOIDR", "CHAP_1R", "CHAP_2R", "CHAP_3R", "CHAP_4R", "CHIPPYR", "PERCR", "SECRETR", "BONESR", "OCTOR", "RITHMR", "STALKR", "BORKR", "CRUCIBR", "HUB", "HALL", "ORB", "CHESS", }, HEXEN2 = { "CASA1", "CASA2", "CASA3", "CASA4", "EGYP1", "EGYP2", "EGYP3", "MESO1", "MESO2", "MESO3", "ROMA1", "ROMA2", "ROMA3", "CASB1", "CASB2", "CASB3", "TULKU1", "TULKU2", "TULKU3", "TULKU4", "TULKU5", "TULKU6", "TULKU7", "TULKU8", "TULKU9", "TULKU10", }, CHEX = { "D_C_E1M1", "D_C_E1M2", "D_C_E1M3", "D_C_E1M4", "D_C_E1M5", "D_C_E2M1", "D_C_E2M2", "D_C_E2M3", "D_C_E2M4", "D_C_E2M5", "D_C_E3M1", "D_C_E3M2", "D_C_E3M3", "D_C_E3M4", "D_C_E3M5", "D_C_INTR", "D_C_VICT", "D_C_BUNN", }, HELL2PAY = { "D_HTP_01", "D_HTP_02", "D_HTP_03", "D_HTP_04", "D_HTP_05", "D_HTP_06", "D_HTP_07", "D_HTP_08", "D_HTP_09", "D_HTP_10", "D_HTP_11", "D_HTP_12", "D_HTP_13", "D_HTP_14", "D_HTP_15", "D_HTP_16", "D_HTP_17", "D_HTP_18", "D_HTP_19", "D_PG_01", }, ICARUS = { "D_ICA_01", "D_ICA_02", "D_ICA_03", "D_ICA_04", "D_ICA_05", "D_ICA_06", "D_ICA_07", "D_ICA_08", "D_ICA_09", "D_ICA_10", "D_ICA_11", "D_ICA_12", "D_ICA_13", "D_ICA_14", "D_ICA_15", "D_ICA_16", "D_ICA_17", "D_ICA_18", "D_ICA_19", "D_ICA_20", "D_ICA_21", "D_ICA_22", "D_ICA_23", "D_ICA_24", "D_ICA_25", "D_ICA_26", "D_ICA_27", "D_ICA_28", "D_ICA_29", "D_ICA_30", "D_ICA_31", "D_ICA_32", }, ED3 = { "D_ED3_01", "D_ED3_02", "D_ED3_03", "D_ED3_04", "D_ED3_05", "D_ED3_06", "D_ED3_07", "D_ED3_08", "D_ED3_09", "D_ED3_10", "D_ED3_11", "D_ED3_12", "D_ED3_13", "D_ED3_14", "D_ED3_15", "D_ED3_16", "D_ED3_17", "D_ED3_18", "D_ED3_19", "D_ED3_20", "D_ED3_21", "D_ED3_22", "D_ED3_23", "D_ED3_24", "D_ED3_25", "D_ED3_26", "D_ED3_27", "D_ED3_28", "D_ED3_29", "D_ED3_30", "D_ED3_31", "D_ED3_32", }, ADO = { "D_ADO_11", "D_ADO_12", "D_ADO_13", "D_ADO_14", "D_ADO_15", "D_ADO_16", "D_ADO_17", "D_ADO_18", "D_ADO_19", "D_ADO_20", "D_ADO_21", "D_ADO_22", "D_ADO_23", "D_ADO_24", "D_ADO_25", "D_ADO_26", "D_ADO_27", "D_ADO_28", "D_ADO_29", "D_ADO_30", "D_ADO_31", "D_ADO_32", "D_ADO_33", "D_ADO_34", "D_ADO_35", "D_ADO_36", "D_ADO_37", "D_ADO_38", "D_ADO_39", "D_ADO_49", }, DUKE = { "233C", "AHGEEZ", "ALFREDH", "ALIENZ", "DETHTOLL", "FATCMDR", "FUTURMIL", "GLOOMY", "GOTHAM", "GRABBAG", "GUTWRNCH", "INHIDING", "INTENTS", "INVADER", "LAYERS", "LORDOFLA", "NAMES", "PIZZED", "ROBOCREP", "SNAKE1", "SPOOK", "STALAG", "STALKER", "STORM", "STREETS", "SUBWAY", "THECALL", "URBAN", "WATRWLD1", "WHOMP", "XPLASMA", "BAKEDGDS", "BRIEFING", "CF", "DEPART", "FLOGHORN", "LEMCHILL", "MISSIMP", "POB", "PREPD", "RESTRICT", "WAREHAUS", }, DESCENT = { "D_CENT01", "D_CENT02", "D_CENT03", "D_CENT04", "D_CENT05", "D_CENT06", "D_CENT07", "D_CENT08", "D_CENT09", "D_CENT10", "D_CENT11", "D_CENT12", "D_CENT13", "D_CENT14", "D_CENT15", "D_CENT16", "D_CENT17", "D_CENT18", "D_CENT19", "D_CENT20", "D_CENT21", "D_CENT22", "D_CENT23", "D_CENT24", "D_CENT25", "D_CENT26", "D_CENT27", "D_CENT28", "D_CENT29", "D_CENT30", "D_CENT31", "D_CENT32", "D_CENT33", "D_CENT34", "D_CENT35", "D_CENT36", "D_CENT37", "D_CENT38", "D_CEN2TT", "D_CEN2BF", "D_CEN2CR", "D_CEN2_1", "D_CEN2_2", "D_CEN2_3", "D_CEN2_4", }, ROTT = { "CCCOOL", "CHANT", "EVINRUDE", "EXCALIBR", "FASTWAY", "GAZZ", "HELLERO", "HOWDIDO", "KISSOFF", "MEDIEV1A", "MISTACHE", "OWW", "RADAGIO", "RISE", "RUNLIKE", "SHARDS", "SMOKE", "SMOOTH", "SPRAY", "STAIRS", "SUCKTHIS", "TASKFORC", "WATZNEXT", "WHERIZIT", "WORK_DAY", "YOUSUCK" }, } last_used = {} function Jukebox_begin_level(self) local replace_table = nil local music_table = {} if self.options.which_music.value == "inter" then return end if self.options.music_doom1.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DOOM1) end if self.options.music_doom2.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DOOM2) end if self.options.music_tnt.value == "include" then shallow_merge(music_table, MUSICS_TABLE.TNT) end if self.options.music_heretic.value == "include" then shallow_merge(music_table, MUSICS_TABLE.HERETIC) end if self.options.music_hexen.value == "include" then shallow_merge(music_table, MUSICS_TABLE.HEXEN) end if self.options.music_hexen2.value == "include" then shallow_merge(music_table, MUSICS_TABLE.HEXEN2) end if self.options.music_chex.value == "include" then shallow_merge(music_table, MUSICS_TABLE.CHEX) end if self.options.music_mm1.value == "include" then shallow_merge(music_table, MUSICS_TABLE.MM1) end if self.options.music_mm2.value == "include" then shallow_merge(music_table, MUSICS_TABLE.MM2) end if self.options.music_icarus.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ICARUS) end if self.options.music_requiem.value == "include" then shallow_merge(music_table, MUSICS_TABLE.REQUIEM) end if self.options.music_strain.value == "include" then shallow_merge(music_table, MUSICS_TABLE.STRAIN) end if self.options.music_htp.value == "include" then shallow_merge(music_table, MUSICS_TABLE.HELL2PAY) end if self.options.music_hr2.value == "include" then shallow_merge(music_table, MUSICS_TABLE.HR2) end if self.options.music_wos.value == "include" then shallow_merge(music_table, MUSICS_TABLE.WOS) end if self.options.music_ed3.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ED3) end if self.options.music_2002ado.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ADO) end if self.options.music_duke.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DUKE) end if self.options.music_descent.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DESCENT) end if self.options.music_rott.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ROTT) end if self.options.music_jimmy.value == "include" then shallow_merge(music_table, MUSICS_TABLE.JIMMY) end if self.options.music_fortytwo.value == "include" then shallow_merge(music_table, MUSICS_TABLE.FORTYTWO) end if OB_CONFIG.game == "doom2" or OB_CONFIG.game == "freedoom" then replace_table = DOOM2_ORIGINAL_MUSIC end local chosen_music = "" local loop = 0 chosen_music = rand_element(music_table) if self.options.no_repeats.value == "yes" then if table_contains(last_used, chosen_music) then while table_contains(last_used, chosen_music) do chosen_music = rand_element(music_table) loop = loop + 1 if loop > 34 then -- We used -ALL- the tracks. Just pick anything. chosen_music = rand_element(music_table) break end end end end if replace_table then gui.printf("Music for level %s (%s) = %s\n", LEVEL.name, replace_table[LEVEL.name], chosen_music) gui.wad_transfer_lump("j-jukebox-v7.wad", chosen_music, replace_table[LEVEL.name]) else gui.printf("Music for level %s (%s) = %s\n", LEVEL.name, string.format("D_%s", LEVEL.name), chosen_music) gui.wad_transfer_lump("j-jukebox-v7.wad", chosen_music, string.format("D_%s", LEVEL.name)) end table.insert (last_used, chosen_music) end function Jukebox_all_done(self) local intermus = "D_INTER" local storymus = "D_VICTOR" local newinter = nil local newstory = nil local music_table = {} if self.options.which_music.value == "levels" then return end if self.options.music_doom1.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DOOM1) end if self.options.music_doom2.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DOOM2) end if self.options.music_tnt.value == "include" then shallow_merge(music_table, MUSICS_TABLE.TNT) end if self.options.music_mm1.value == "include" then shallow_merge(music_table, MUSICS_TABLE.MM1) end if self.options.music_mm2.value == "include" then shallow_merge(music_table, MUSICS_TABLE.MM2) end if self.options.music_icarus.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ICARUS) end if self.options.music_requiem.value == "include" then shallow_merge(music_table, MUSICS_TABLE.REQUIEM) end if self.options.music_strain.value == "include" then shallow_merge(music_table, MUSICS_TABLE.STRAIN) end if self.options.music_htp.value == "include" then shallow_merge(music_table, MUSICS_TABLE.HELL2PAY) end if self.options.music_hr2.value == "include" then shallow_merge(music_table, MUSICS_TABLE.HR2) end if self.options.music_wos.value == "include" then shallow_merge(music_table, MUSICS_TABLE.WOS) end if self.options.music_ed3.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ED3) end if self.options.music_2002ado.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ADO) end if self.options.music_duke.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DUKE) end if self.options.music_descent.value == "include" then shallow_merge(music_table, MUSICS_TABLE.DESCENT) end if self.options.music_rott.value == "include" then shallow_merge(music_table, MUSICS_TABLE.ROTT) end if self.options.music_jimmy.value == "include" then shallow_merge(music_table, MUSICS_TABLE.JIMMY) end if self.options.music_fortytwo.value == "include" then shallow_merge(music_table, MUSICS_TABLE.FORTYTWO) end if OB_CONFIG.game == "doom2" or OB_CONFIG.game == "freedoom" then intermus = "D_DM2INT" storymus = "D_READ_M" replace_table = DOOM2_ORIGINAL_MUSIC end local loop = 0 newinter = rand_element(music_table) if self.options.no_repeats.value == "yes" then if table_contains(last_used, newinter) then while table_contains(last_used, newinter) do newinter = rand_element(music_table) loop = loop + 1 if loop > #music_table then -- We used -ALL- the tracks. Just pick anything. newinter = rand_element(music_table) break end end end end gui.printf("Music for intermission (%s) = %s\n", intermus, newinter) loop = 0 newstory = rand_element(music_table) if table_contains(last_used, newstory) then while table_contains(last_used, newstory) do newstory = rand_element(music_table) loop = loop + 1 if loop > #music_table then -- We used -ALL- the tracks. Just pick anything. newstory = rand_element(music_table) break end end end gui.printf("Music for story screen (%s) = %s\n", storymus, newstory) gui.wad_transfer_lump("j-jukebox-v7.wad", newinter, intermus) gui.wad_transfer_lump("j-jukebox-v7.wad", newstory, storymus) end JUKEBOX_CHOICES = { "include", "Include", "skip", "Skip", } JUKEBOX_BOOL_CHOICES = { "yes", "Yes", "no", "No", } JUKEBOX_REPLACE_CHOICES = { "both", "Both", "levels", "Levels", "inter", "Intermission", } OB_MODULES["jukebox"] = { label = "Jimmy's Jukebox - Music", for_games = { doom1=1, doom2=1, freedoom=1 }, begin_level_func = Jukebox_begin_level, all_done_func = Jukebox_all_done, options = { no_repeats = { label="No Repeats", choices=JUKEBOX_BOOL_CHOICES }, which_music = { label="Music to Replace", choices=JUKEBOX_REPLACE_CHOICES }, music_doom1 = { label="Doom 1", choices=JUKEBOX_CHOICES }, music_doom2 = { label="Doom 2", choices=JUKEBOX_CHOICES }, music_tnt = { label="TNT: Evilution", choices=JUKEBOX_CHOICES }, music_heretic = { label="Heretic", choices=JUKEBOX_CHOICES }, music_hexen = { label="Hexen", choices=JUKEBOX_CHOICES }, music_hexen2 = { label="Hexen II", choices=JUKEBOX_CHOICES }, music_chex = { label="Chex Quest 3", choices=JUKEBOX_CHOICES }, music_mm1 = { label="Memento Mori", choices=JUKEBOX_CHOICES }, music_mm2 = { label="Memento Mori 2", choices=JUKEBOX_CHOICES }, music_icarus = { label="Icarus", choices=JUKEBOX_CHOICES }, music_requiem = { label="Requiem", choices=JUKEBOX_CHOICES }, music_strain = { label="STRAIN", choices=JUKEBOX_CHOICES }, music_htp = { label="Hell To Pay", choices=JUKEBOX_CHOICES }, music_hr2 = { label="Hell Revealed 2", choices=JUKEBOX_CHOICES }, music_wos = { label="Whispers of Satan", choices=JUKEBOX_CHOICES }, music_ed3 = { label="Eternal Doom 3", choices=JUKEBOX_CHOICES }, music_2002ado = { label="2002:ADO", choices=JUKEBOX_CHOICES }, music_duke = { label="Duke Nukem 3D", choices=JUKEBOX_CHOICES }, music_descent = { label="Descent 1 & 2", choices=JUKEBOX_CHOICES }, music_rott = { label="Rise of the Triad", choices=JUKEBOX_CHOICES }, music_jimmy = { label="Jimmy's Music", choices=JUKEBOX_CHOICES }, music_fortytwo = { label="Forty-Two's Music", choices=JUKEBOX_CHOICES }, } }