Lemon Posted June 28, 2016 Share Posted June 28, 2016 (edited) Started working on this project again. This new one is a little better. It doesn't read quests that were designed prior to PSOBB, so that's the next step. How to work it: Extract the executable to the folder with your quests. Run the executable Open the output.csv table that will hold all monster counts for all BB quests in that folder and subfolders. Smile. <---- required Download link: https://mega.nz/#!KVBGwKrZ!w0zDSY8-LE-VQVFAFbkLJpvejVntsx6Ubdm7_OmOmmA Edited May 15, 2017 by Lemon 5 1 Quote Link to comment Share on other sites More sharing options...
R-78 Posted June 29, 2016 Share Posted June 29, 2016 Amazing, Lemon Quote Link to comment Share on other sites More sharing options...
Lemon Posted June 29, 2016 Author Share Posted June 29, 2016 So don't drag more than 1 file in, it looks bad at the moment. I may get around to fixing it later. Quote Link to comment Share on other sites More sharing options...
Lemon Posted October 3, 2016 Author Share Posted October 3, 2016 Eh, this is missing Slime and Dark Gunner, so if something pops up as 'Unknown' that's what it is. I'll put out an update when I get some time. Quote Link to comment Share on other sites More sharing options...
Larva Posted November 16, 2016 Share Posted November 16, 2016 On 6/28/2016 at 3:17 PM, Lemon said: R-78 asked me if there was a better way than counting monsters by hand in qedit (Horrible experience), so I decided to make a tool for it. Understand that this was made in two hours, so if it doesn't work amazing, post your bug and I may or may not find time to fix it. How to work it: Export monster floor data via that 'export floor data' button, and in the drop down specify monsters only. Save that somewhere special. Drag and drop that file over MonsterCounter.exe Read results Download link: https://mega.nz/#!fJJTHAaD!ZyWKyD_vzgKqolWp8YqrPDgbcVIuN9cThYflyTT2mjk Source code Reveal hidden contents using System; using System.Collections.Generic; namespace MonsterCounter { class MonsterCounterClass { static void Main(string[] args) { Console.Title = "Lemon's Monster Counter"; try { for (int a = 0; a<args.Length; a++) { List<byte> allData = new List<byte>(System.IO.File.ReadAllBytes(args[a])); Dictionary<string, int> totals = new Dictionary<string, int>(); while (allData.Count > 0) { byte[] currentMonster = new byte[72]; for (int i = 0; i < 72; i++) { currentMonster[i] = allData[0]; allData.RemoveAt(0); } string key = GetKey(currentMonster); if (totals.ContainsKey(key)) { totals[key]++; } else { totals.Add(key, 1); } } // print data foreach (KeyValuePair<string, int> entry in totals) { Console.WriteLine("{0}{1}{2}", entry.Key, new string(' ', 20 - entry.Key.Length), entry.Value); } } if (args.Length == 0) Console.WriteLine("Specify a monster floor chunk file."); } catch { Console.WriteLine("Bad File."); } Console.ReadLine(); } private static string GetKey(byte[] monster) { byte flag = monster[0]; switch (flag) { case 0x40: return "Hildebear"; case 0x41: return "Rag Rappy"; case 0x42: return "Monest"; case 0x43: if (monster[50] == 0x00) return "Savage Wolf"; return "Barbarous Wolf"; case 0x44: if (monster[64] == 0x00) return "Booma"; if (monster[64] == 0x01) return "Gobooma"; return "Gigabooma"; case 0x60: return "Grass Assassin"; case 0x61: return "Poison Lily"; case 0x62: return "Nano Dragon"; case 0x63: if (monster[64] == 0x00) return "Evil Shark"; if (monster[64] == 0x01) return "Guil Shark"; return "Pal Shark"; case 0x65: return "Pan Arms"; case 0x80: if (monster[64] == 0x00) return "Dubchic"; return "Gilchic"; case 0x81: return "Garnaz"; case 0x82: if (monster[50] == 0x00) return "Sino Blue"; return "Sino Gold"; case 0x83: if (monster[47] == 0x00) return "Canadine"; return "Canadine_Zoning"; case 0x84: return "Canane"; case 0x85: return "Dubchic Switch"; case 0xA7: return "Bulclaw"; case 0xA1: return "Chaos Sorcerer"; case 0xA8: return "Claw"; case 0xA5: return "Dark Belra"; case 0xA4: return "Chaos Bringer"; case 0xA0: return "Delsaber"; case 0xA6: if (monster[64] == 0x00) return "Dimenian"; if (monster[64] == 0x01) return "La Dimenian"; return "So Dimenian"; case 0xC0: return "Dragon | Gal"; case 0xC1: return "De Rol Le"; case 0xC2: return "Vol Opt part A"; case 0xC5: return "Vol Opt"; case 0xC8: return "Dark Falz"; case 0xCA: return "Olga Flow"; case 0xCB: return "Barba Ray"; case 0xCC: return "Gol Dragon"; case 0x19: if (monster[64] == 0x00) return "Saint Million"; return "Shambertin"; case 0xD9: return "Gee"; case 0xDA: return "Gi Gue"; case 0xD8: return "Gibbles"; case 0xD6: if (monster[64] == 0x00) return "Mericarol"; if (monster[64] == 0x01) return "Merikle"; return "Mericus"; case 0xD5: if (monster[64] == 0x00) return "Merillia"; return "Meriltas"; case 0xD4: if (monster[64] == 0x00) return "Sino Berill"; return "Sino Spigell"; case 0xD7: if (monster[64] == 0x00) return "Ul Gibbon"; return "Zol Gibbon"; case 0xDC: return "Delbiter"; case 0xDB: return "Deldepth"; case 0xDD: if (monster[64] == 0x00) return "Dolmolm"; return "Dolmdarl"; case 0xE0: if (monster[64] == 0x00) return "Sinow Zoa | Epsilon"; return "Sinow Zele"; case 0xDE: return "Morphos"; case 0xDF: return "Recobox"; case 0xE1: return "Ill Gil"; case 0x10: return "Astark"; case 0x15: if (monster[64] == 0x00) return "Boota"; if (monster[64] == 0x01) return "Ze Boota"; return "Ba Boota"; case 0x16: return "Dorphon"; case 0x11: if (monster[50] == 0x00) return "Satellite Lizard"; return "Yowie"; case 0x14: return "Zu"; case 0x13: return "Girtablulu"; case 0x12: return "Merissa A"; case 0x17: if (monster[64] == 0x00) return "Goran"; if (monster[64] == 0x01) return "Pyro Goran"; return "Goran Detonator"; default: return "Unknown"; } } } } If anyone wants to write something to automate the monster floor data extraction, I'll combine them into a monster-count-for-full-server tool thing. Cool man Thanks. Quote Link to comment Share on other sites More sharing options...
Lemon Posted May 15, 2017 Author Share Posted May 15, 2017 Updated to a better(?) version! This one reads .qst files directly, and will read all of them! So drop this in the root of your server and it will produce a csv file of all the quest counts for your server! Right now it doesn't read some quests. I think that's because they are using a different header structure (because they're older). I'll be fixing this next. (ugly source code is included) Download: https://mega.nz/#!KVBGwKrZ!w0zDSY8-LE-VQVFAFbkLJpvejVntsx6Ubdm7_OmOmmA 2 Quote Link to comment Share on other sites More sharing options...
killswitch Posted May 15, 2017 Share Posted May 15, 2017 we cant get banned for using this....i miss the solo door opener Quote Link to comment Share on other sites More sharing options...
Lemon Posted May 15, 2017 Author Share Posted May 15, 2017 Haha this is a server tool, it wont do anything to the client. Quote Link to comment Share on other sites More sharing options...
O9B066 Posted October 5, 2017 Share Posted October 5, 2017 i donmt makre quests, so i dont know where the quest folder is, that this goes into. I would like to do a enemy count for all quests, and make a new post, as that ones from 2011, so helps appreciated. Quote Link to comment Share on other sites More sharing options...
Ki Fung Chan Posted October 6, 2017 Share Posted October 6, 2017 I repeated step 4, is this acceptable 1 Quote Link to comment Share on other sites More sharing options...
Lemon Posted October 6, 2017 Author Share Posted October 6, 2017 On 10/5/2017 at 7:05 AM, O9B066 said: i donmt makre quests, so i dont know where the quest folder is, that this goes into. I would like to do a enemy count for all quests, and make a new post, as that ones from 2011, so helps appreciated. I can do most of the quests, but some of the custom ones I don't have. You'd have to have access to the server files to do it legit like though. Quote Link to comment Share on other sites More sharing options...
Soly Posted October 6, 2017 Share Posted October 6, 2017 You should probably make it output some nice HTML (or JSON). We could then display counts in the site. Quote Link to comment Share on other sites More sharing options...
Lemon Posted October 6, 2017 Author Share Posted October 6, 2017 (edited) Hmm well it does csv right now. I guess I could make it do html or json. I couldn't figure out how to make it look nice so that's why I picked csv as a kind of db feel, though json would probably be better. When I get a chance I can change it. EDIT: output.csv Here's something to get you started. This is just the stuff that came default with Aselia (back when I was testing it forever ago when it didn't have a name). Edited October 6, 2017 by Lemon Quote Link to comment Share on other sites More sharing options...
Soly Posted October 6, 2017 Share Posted October 6, 2017 I think the best route is JSON because that can be easily used by basically any programming language (relevant for us). If you want some help with that, you can hit me up in discord but you shouldn't have too much trouble reading Json.Net docs. Quote Link to comment Share on other sites More sharing options...
Lemon Posted October 6, 2017 Author Share Posted October 6, 2017 Ok, this version spits out json. I'm going to rewrite this since it's incredibly unmaintainable code, but it seems to work. questCounterJSON.exe Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.