--- Log opened Sat May 11 00:00:47 2019 20190511 02:01:30-!- irker350 [~irker@wesnoth/umc-dev/bot/shikadibot] has quit [Quit: transmission timeout] 20190511 02:01:39-!- irker676 [~irker@wesnoth/umc-dev/bot/shikadibot] has joined #wesnoth-dev 20190511 02:01:39< irker676> wesnoth/wesnoth:master newfrenchy83 ccb65748d7 add loyal overlay to loyal trait definit AppVeyor: All builds passed 20190511 04:39:32-!- celticminstrel [~celmin@unaffiliated/celticminstrel] has quit [Quit: And lo! The computer falls into a deep sleep, to awake again some other day!] 20190511 05:03:04-!- irker676 [~irker@wesnoth/umc-dev/bot/shikadibot] has quit [Quit: transmission timeout] 20190511 05:08:05-!- irker123 [~irker@wesnoth/umc-dev/bot/shikadibot] has joined #wesnoth-dev 20190511 05:08:05< irker123> wesnoth/wesnoth:master newfrenchy83 5eec963c53 Update attack_type.cpp AppVeyor: All builds passed 20190511 07:12:49< irker123> wesnoth/wesnoth:1.14 loonycyborg 6f77ab327e forum_user_handler: recreate sql connect AppVeyor: All builds passed 20190511 08:02:26-!- zookeeper [~lmsnie@wesnoth/developer/zookeeper] has joined #wesnoth-dev 20190511 08:42:34< irker123> wesnoth/wesnoth:1.14 josteph b835e38a47 try to fix travis AppVeyor: All builds passed 20190511 09:10:30-!- stikonas [~gentoo@wesnoth/translator/stikonas] has joined #wesnoth-dev 20190511 09:42:41< irker123> wesnoth/wesnoth:1.14 josteph 8b511c0a14 try to fix travis AppVeyor: All builds passed 20190511 10:08:40-!- stikonas [~gentoo@wesnoth/translator/stikonas] has quit [Remote host closed the connection] 20190511 10:18:37<+wesdiscordbot> @Yumi Comma splice in the new TSG description 20190511 10:20:43<+wesdiscordbot> @Ravana ^ 20190511 10:33:18< Ravana> second commit doesn't need additional debug check 20190511 10:33:25< Ravana> but not sure what else you askedd 20190511 10:42:42<+wesdiscordbot> Just wanted you to know these commits are a thing. I imagine they'll be useful for debugging Ageless 20190511 10:44:08<+wesdiscordbot> I see what you mean about the debug check 20190511 10:44:56<+wesdiscordbot> Also, I only tested that commit in English ... 20190511 11:02:15< Ravana> it helps, so far it has been required to check unit description 20190511 11:43:37<+wesdiscordbot> So, I've been critical of the legacy codebase a lot of times, but in hindsight one area where we are definitely great is our robust number of build methods. Godot only has scons if you want to custom compile. 😐 20190511 11:45:21<+wesdiscordbot> (you can use MSVC but only after generating projectfiles that just call scons anyway 😐 😐 😐 ) 20190511 11:45:31<+wesdiscordbot> (and you need to install pywin32 if you want to use -j) 20190511 11:45:47<+wesdiscordbot> so, yeah, I have renewed appreciation for the number of choices we have here for compiling 20190511 11:45:57<+wesdiscordbot> Can't SCons generate MSVC project files anyway? 20190511 11:46:19<+wesdiscordbot> yes, but it still builds with scons. 20190511 11:47:26<+wesdiscordbot> the project files scons spits out are basically just GUI wrappers for the scons script. 20190511 11:48:53<+wesdiscordbot> Godot's C++ side also sadly stands in stark contrast to its excellent front-end editor. 20190511 11:49:06<+wesdiscordbot> It still uses C++03 and does not use the STL 😒 20190511 11:51:06<+wesdiscordbot> What? C++03 in 2019? We were already using some C++11 features at Rovio when I started there in 2013 (and it was the GCC version available for iOS compiling holding us back).. 20190511 11:51:46<+wesdiscordbot> they do switch to C++14 with 3.2/4.0 though. 20190511 11:51:57<+wesdiscordbot> They are only low starting to switch to c++11 20190511 11:52:23<+wesdiscordbot> Ah, c++11 it was. 20190511 11:53:15<+wesdiscordbot> still, they do modernize a little. 20190511 11:54:21<+wesdiscordbot> by not using the STL they also implement their own custom types. most common of which is a custom array type which is not templated (it stores a variant). 20190511 11:57:57<+wesdiscordbot> I do agree though that the reasoning as to why they are not go for modern c++ is kind of off. Juan bascally said he feels to old to learn new stuff. 20190511 11:58:06<+wesdiscordbot> and COW semantics on a bunch of stuff too... which... I still don't fully understand 20190511 11:58:28<+wesdiscordbot> why would you need to copy on write 20190511 11:58:46<+wesdiscordbot> Most likely performance. 20190511 12:01:40<+wesdiscordbot> im told by some people on their discord having CoW vectors (and strings I think?) greatly harms performance 20190511 12:01:46<+wesdiscordbot> but that it's mostly in the 3D renderer 20190511 12:01:48<+wesdiscordbot> which we don't need 20190511 12:01:50<+wesdiscordbot> thankfully 20190511 12:02:07<+wesdiscordbot> Does Godot have a separate 2D renderer? 20190511 12:02:24<+wesdiscordbot> (also apparently they use a ton of linked lists which I'm told is bad but I don't understand why) 20190511 12:02:26<+wesdiscordbot> 2D is just a special case of 3D and some game engines (such as Unity) use the 3D renderer for both. 20190511 12:03:58<+wesdiscordbot> not sure how it's handled under the hood, but there is a definite separation of 2d and 3d scenes (for one, there are different node types for 2d and 3d) 20190511 12:04:30<+wesdiscordbot> the renderer is GLES3 right now 20190511 12:04:32<+wesdiscordbot> Godot indeed has a separate 2D renderer 20190511 12:04:33<+wesdiscordbot> but Vulkan is coming 20190511 12:04:49<+wesdiscordbot> Yeah, linked lists are absolutely terrible for performance. The processor's memory access predictor can't predict which memory addresses the code will try to access, and as a result iterating a linked list is very slow. 20190511 12:05:10<+wesdiscordbot> https://www.youtube.com/watch?v=YQs6IC-vgmo 20190511 12:05:56<+wesdiscordbot> Even though there are situations where linked lists are faster in algorighmic complexity (the big O notation), in practice their overhead is so bad that they should almost never be used. 20190511 12:06:54<+wesdiscordbot> what is CoW btw? 20190511 12:07:00<+wesdiscordbot> Copy-on-Write 20190511 12:09:47<+wesdiscordbot> "linked lists being used as dynamic array is a HUGE issue in godot", to quote a guy on their server 20190511 12:10:07<+wesdiscordbot> so, yeah. im a little disappointed after looking at their backend 20190511 12:10:12<+wesdiscordbot> because their have such a good frontend 20190511 12:10:27<+wesdiscordbot> the most interesting part here is how you'll handle terrain transitions 20190511 12:10:35<+wesdiscordbot> yeah, that's a challenge 20190511 12:10:46<+wesdiscordbot> from what I can tell godot is still basically a scene graph based engine 20190511 12:11:04<+wesdiscordbot> terrain is totally alien thing to it 20190511 12:11:14<+wesdiscordbot> what do you mean by scene graph? 20190511 12:11:51<+wesdiscordbot> hierarchical structure containing drawables 20190511 12:12:21<+wesdiscordbot> basically terrain isn't hierarchical 20190511 12:12:25<+wesdiscordbot> it's array of tiles 20190511 12:14:02<+wesdiscordbot> our current solution is to use 8 of their TileMap nodes. One for main terrain, one for overlay terrains, and then 6 dynamically generated ones that each handle a direction of transition. 20190511 12:14:31<+wesdiscordbot> not the most efficient method since it means the ToD shader needs 8 render passes... still trying to fix that 20190511 12:14:55<+wesdiscordbot> though I can get consistent 60 FPS, so maybe it's not a huge issue 20190511 12:16:04<+wesdiscordbot> TileMap was designed for, well, tile-based maps 20190511 12:16:37<+wesdiscordbot> by utilizing the Half Y Offset mode with a tile size of something something by 72 our hex images fit perfectly 20190511 12:17:14<+wesdiscordbot> their tilesets also have autotile support. Problem is, that was designed for rectangular tiles. 20190511 12:17:20<+wesdiscordbot> so we need to get creative for transitions 20190511 12:17:24<+wesdiscordbot> TileMap renders all their tiles as one texture, which means all the terrains are rendered as 6 textures internally right now. I think that's a huge benefit over rendering every single transition sprite as single texture. 20190511 12:17:35<+wesdiscordbot> indeed 20190511 12:17:50<+wesdiscordbot> which is why it's probably not a massive issue that it's split into 8 20190511 12:18:27<+wesdiscordbot> but we absolutely need the spritesheet support they're adding in 3.2 20190511 12:18:41<+wesdiscordbot> (the import as sheet thing) 20190511 12:18:50<+wesdiscordbot> yeah that'll be neat. 20190511 12:18:52<+wesdiscordbot> how are you going to generate sprite sheets? 20190511 12:18:56<+wesdiscordbot> with which tools? 20190511 12:19:22<+wesdiscordbot> will have to see what the final feature looks like in 3.2 20190511 12:19:31<+wesdiscordbot> right now I think it's mostly an import setting 20190511 12:19:41<+wesdiscordbot> ie, images will be combined into a single texture engine-side 20190511 12:19:49<+wesdiscordbot> while remaining separate on the filesystem 20190511 12:21:27<+wesdiscordbot> But I don't know 20190511 12:21:49<+wesdiscordbot> https://godotengine.org/article/atlas-support-returns-godot-3-2 20190511 12:22:14<+wesdiscordbot> to me assembling texture atlases and generating mipmaps looks like a good candidate for a buildsystem step 😛 20190511 12:22:41<+wesdiscordbot> Yeah, at least Unity does it that way. 20190511 12:23:27<+wesdiscordbot> hmm that makes me wonder 20190511 12:23:27<+wesdiscordbot> big terrain thing we have yet to figure out is animated terrains 20190511 12:23:32<+wesdiscordbot> and multi-hex terrains 20190511 12:23:35<+wesdiscordbot> how mipmapping works for texture atlases 20190511 12:23:48<+wesdiscordbot> are mipmapped images assembled into atlases? 20190511 12:23:56<+wesdiscordbot> or entire atlases are mipmapped? 20190511 12:24:29<+wesdiscordbot> I think it's the latter. 20190511 12:25:08<+wesdiscordbot> either way could be better depending on what happens inside videocard I guess 20190511 12:25:31<+wesdiscordbot> also that link says that atlases fell into disuse due to more power on desktops etc 20190511 12:25:41<+wesdiscordbot> you still sure wesnoth actually requires it? 20190511 12:26:24<+wesdiscordbot> considering the sheet number of transition images it would be prudent, I think. 20190511 12:27:14<+wesdiscordbot> hmm I think it would be better to autogenerate them anyway 20190511 12:28:18<+wesdiscordbot> like there is no need to have two images for transitions in different directions 20190511 12:28:29<+wesdiscordbot> because you can generate them by rotation anyway 20190511 12:28:37<+wesdiscordbot> 🤔 20190511 12:29:39<+wesdiscordbot> that's certainly an idea 20190511 12:29:45<+wesdiscordbot> don't think we considered that 20190511 12:30:43<+wesdiscordbot> though... that would only work if transitions are symmetrical across directions 20190511 12:32:48<+wesdiscordbot> the ends of bridges depend on the orientation of the bridge / or | or , don't they 20190511 12:33:17<+wesdiscordbot> (why would discord think I was trying to escape a comma...) 20190511 12:33:29<+wesdiscordbot> there's another combinatorial explosion yet 20190511 12:33:47<+wesdiscordbot> like there is a transition for each combination of two terrain types 20190511 12:34:00<+wesdiscordbot> seems generally they have a priority system 20190511 12:34:10<+wesdiscordbot> to determine which terrain's transition will be used 20190511 12:42:42-!- irker123 [~irker@wesnoth/umc-dev/bot/shikadibot] has quit [Quit: transmission timeout] 20190511 12:43:46<+wesdiscordbot> from what I got you actually treat transitions as more or less a separate thing, and define under which condition it apprears. Like. - have that transition these sprites - make them come from these terrain types - display them on these terrain types so you e.g. make a new transition Terrain.new_transition("grass-to-water", G*, W*) use the grass-to-water sprites, make them come from all grass tiles, only display them on 20190511 12:43:46<+wesdiscordbot> water sprites. this way there is also no issue with two directional transitions. like having dry grass transition ot green grass and vise versa to create an even smoother transition. 20190511 12:44:39<+wesdiscordbot> (as a rough pseudo code example) 20190511 12:46:03<+wesdiscordbot> which is somewhat what I have in mind once I get to rewrite the terrain code for haldric 20190511 12:46:53<+wesdiscordbot> and how to handle two terrain types for which there is no transtion? 20190511 12:47:09< zookeeper> some kind of simple default blend. 20190511 12:47:19< zookeeper> (or at least that seems reasonable) 20190511 12:47:45<+wesdiscordbot> is there such a terrain? 20190511 12:48:05<+wesdiscordbot> potentially 20190511 12:48:43<+wesdiscordbot> like if you add a terrain type you'd have to specify all transtions with all other terrain types that already exist 20190511 12:49:03<+wesdiscordbot> would be cool if there was a faster way 20190511 12:49:05< zookeeper> when one is not limited only to placing predrawn images, there's all sorts of ways you could do transitions, the simplest naive method being a fade transition. 20190511 12:49:26<+wesdiscordbot> like you rule that new terrain type is suitably grassland like and should use grassland's transistions 20190511 12:50:02<+wesdiscordbot> or maybe 20190511 12:50:14<+wesdiscordbot> don't have transitions between terrain types 20190511 12:50:20<+wesdiscordbot> but only terrain type categories 20190511 12:50:37<+wesdiscordbot> transision itself will be only alpha channel texture 20190511 12:51:16<+wesdiscordbot> and you mix two terrain textures for each pixel using transition texture as alpha value 20190511 12:51:40< zookeeper> yeah. all grass could have the same kind of alpha transition with its neighbours, etc. wouldn't need more than one hex-sized tileable alpha tile per category for that. 20190511 12:57:35-!- celticminstrel [~celmin@unaffiliated/celticminstrel] has joined #wesnoth-dev 20190511 13:00:18<+wesdiscordbot> thing is, we can't do everything with alphas. So we would need ske 20190511 13:00:21<+wesdiscordbot> ups 20190511 13:00:27<+wesdiscordbot> something that can handle both 20190511 13:31:48<+wesdiscordbot> anyway, here is the current state 20190511 13:31:48<+wesdiscordbot> https://cdn.discordapp.com/attachments/259976436490829825/576763377045602305/haldric.jpg 20190511 13:32:06<+wesdiscordbot> (that fog is animated) 20190511 13:37:10-!- JyrkiVesterinen [~JyrkiVest@wesnoth/developer/jyrkive] has joined #wesnoth-dev 20190511 13:37:21-!- JyrkiVesterinen [~JyrkiVest@wesnoth/developer/jyrkive] has left #wesnoth-dev ["wesnoth-dev"] 20190511 13:37:51<+wesdiscordbot> vn971: Is there anything special about how I should load the save file in #4068? 20190511 13:38:13< vn971> jyrkive: no, just load it and end turn. wesnoth-1.14.7 20190511 13:38:22<+wesdiscordbot> I loaded it in a master build with Creep Wars installed, and I'm getting an "mandatory WML child missing yet untested for" message. 20190511 13:38:31< vn971> jyrkive: I mean, of course, that's just the steps for me. 20190511 13:38:40< vn971> jyrkive: interesting... 20190511 13:38:50<+wesdiscordbot> Hmm. I think I'll try with a 1.14 build then. 20190511 13:38:55< vn971> jyrkive: is it convenient to try 1.14.7 tag? 20190511 13:39:39<+wesdiscordbot> I tend to use a self-built binary from the tip of the corresponding branch. 20190511 13:42:15<+wesdiscordbot> Getting "General Error" when I try to post to the forums, is that expected ? 20190511 13:54:14<+wesdiscordbot> Managed to post in a new tab. 20190511 14:20:50<+wesdiscordbot> vn971: I'm also getting the "mandatory WML child missing yet untested for" message with 1.14.8+dev. 20190511 14:22:19-!- stikonas [~gentoo@wesnoth/translator/stikonas] has joined #wesnoth-dev 20190511 14:27:37-!- irker340 [~irker@wesnoth/umc-dev/bot/shikadibot] has joined #wesnoth-dev 20190511 14:27:38< irker340> wesnoth/wesnoth:master nemaara 38da648634 Add udpated campaign descriptions to cha AppVeyor: All builds passed 20190511 14:28:27<+wesdiscordbot> @jyrkive Try installing Ageless Era 20190511 14:28:40<+wesdiscordbot> I get the same error as you but it disappears when I add Ageless. 20190511 14:28:48<+wesdiscordbot> I don't get a crash 20190511 14:29:08<+wesdiscordbot> Alright, I'll try it. 20190511 14:29:35<+wesdiscordbot> I already know from debugging that the missing WML child is "era" that some code expects to be a child of game_config. 20190511 14:30:25<+wesdiscordbot> Without Ageless I got a bunch of "20190511 14:27:05 error engine/team_construction: game_error: unknown unit type: AE_mrc_oracles_Seer" errors, do you see them too? 20190511 14:30:53<+wesdiscordbot> I don't know, I don't have the console enabled at the moment. 20190511 14:32:04<+wesdiscordbot> OK. 20190511 14:34:38<+wesdiscordbot> How does that "missing child" error work, by the way? When would !*this be true? https://github.com/wesnoth/wesnoth/blob/08979a6736b3fc778cc40022714076c5ccdc8e2b/src/config.cpp#L117-L129 20190511 14:38:54<+wesdiscordbot> When the custom bool comparison operator returns false: https://github.com/wesnoth/wesnoth/blob/6b0ef7e3ce37ac2f447c65a91baa2794a5f0e1fb/src/config.hpp#L140-L141 20190511 14:39:30<+wesdiscordbot> The special invalid config value is returned if you query for a nonexistent child object. 20190511 14:40:17<+wesdiscordbot> Thanks. I wasn't sure if the bool operator would be used because it's explicit. 20190511 14:40:49<+wesdiscordbot> I guess C++ counts negation as explicit conversion to bool. 20190511 14:42:30<+wesdiscordbot> Looks like it. 20190511 14:42:50<+wesdiscordbot> It's unfortunate that that error message has so little information on the context of the error... 20190511 14:43:06<+wesdiscordbot> vn971: I can reproduce the crash you get. 20190511 14:43:31<+wesdiscordbot> The sum of probabilities is 12,5 % (should be 100 %), so it's way out of expected range.. 20190511 14:46:43< vn971> jyrkive: good! Installing Ageless was the key to repro, right? 20190511 14:46:54<+wesdiscordbot> Indeed. 20190511 14:59:17-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has quit [Quit: Caught sigterm, terminating...] 20190511 15:00:49-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has joined #wesnoth-dev 20190511 15:03:16<+wesdiscordbot> But I have ageless and can't reproduce the crash... 20190511 15:03:59<+wesdiscordbot> That's strange. After loading the save, ending the turn is the only thing you should need to do. 20190511 15:04:15<+wesdiscordbot> Try installing Creep Wars if you don't have it yet. 20190511 15:04:44<+wesdiscordbot> title="Creep Wars" type="scenario_mp" uploads=53 version="1.5.1" 20190511 15:04:51<+wesdiscordbot> I do have that installed. 20190511 15:05:20<+wesdiscordbot> And you don't have the "allow Monte Carlo simulation" advanced preference disabled, right? 20190511 15:05:25<+wesdiscordbot> Let me check... 20190511 15:05:51<+wesdiscordbot> damage_prediction_allow_monte_carlo_simulation=no 20190511 15:06:19<+wesdiscordbot> Okay, that explains it. Only Monte Carlo mode performs that check. 20190511 15:06:39<+wesdiscordbot> I can reproduce it with Monte Carlo enabled. 20190511 15:58:48< celticminstrel> (Did the config class not also overload operator! ?) 20190511 15:59:40<+wesdiscordbot> It doesn't overload operator!. 20190511 15:59:49< celticminstrel> Huh. 20190511 16:00:16< celticminstrel> I still think the operator bool should be removed mind you, but that's rather a large undertaking as several other member functions rely heavily on it... :/ 20190511 16:01:26< celticminstrel> Still, it would allow making these errors more informative. 20190511 16:05:58<+wesdiscordbot> I checked earlier, every place that calls check_valid also logs the key it was looking for 20190511 16:06:12< celticminstrel> That's not the problem... 20190511 16:06:19< celticminstrel> The problem is we don't know what the tag name was. 20190511 16:06:29<+wesdiscordbot> that's what I mean, I think 20190511 16:06:36<+wesdiscordbot> it's not in the error message but it is in the log 20190511 16:06:50< celticminstrel> The tag name isn't known by the time check_valid is called tho? 20190511 16:07:07< celticminstrel> The tag name is part of the reference in the parent config; the child config has no knowledge of it. 20190511 16:08:22<+wesdiscordbot> never mind, I was confused 20190511 16:08:27<+wesdiscordbot> places that use invalid explicitly log 20190511 16:08:34<+wesdiscordbot> places that call check_valid() don't 20190511 16:12:29<+wesdiscordbot> Thanks @Yumi 20190511 16:15:24<+wesdiscordbot> 👏 20190511 16:15:51<+wesdiscordbot> and I totally forgot to fix the comment like I said I would 20190511 16:15:54<+wesdiscordbot> ahhhhhhhhhhhhhhhhhhhhhhhhhhhhh 20190511 16:16:07<+wesdiscordbot> guess it needs another commit now >_> 20190511 16:19:58< irker340> wesnoth/wesnoth:1.14 josteph f3c74aa351 Hit stats: Don't serialize by_cth_inflic AppVeyor: All builds passed 20190511 18:15:37<+wesdiscordbot> I'm indeed seeing something strange when debugging vn971's crash issue. 20190511 18:16:36<+wesdiscordbot> It occurs for a unit for which the AI simulates three battles in a row. The unit is initially slowed, but there is a 0,77 % chance that it kills the attacking unit in the first battle, which heals the slow. 20190511 18:16:54<+wesdiscordbot> The second battle is simulated in Monte Carlo mode due to its complexity. 20190511 18:17:39<+wesdiscordbot> Monte Carlo simulation uses 5000 rounds, and on average the unit should be not slowed on 38,5 rounds. 20190511 18:19:08<+wesdiscordbot> However, after the second battle, only seven results are in plane 0 ("neither unit slowed"). In addition, 34 results are in plane 2 ("A not slowed, B slowed") where the unit's HP is very close to the starting HP. 20190511 18:19:17<+wesdiscordbot> 41 is much closer to 38,5 than 7. 20190511 18:19:47<+wesdiscordbot> It's as if the results where the attacking unit hits the defending one even once are somehow ending up in a wrong plane. 20190511 18:20:41<+wesdiscordbot> This second battle doesn't yet crash, but in the third battle the code notices that the HP distribution doesn't match the probability that the defending unit is slowed. 20190511 18:21:58<+wesdiscordbot> At this point, it looks like all these conditions are required for the bug to occur: the AI simulates three battles in a row (which is the maximum number), the last two are simulated in Monte Carlo mode, the defending unit is initially slowed, and the defending unit may level up in the first battle. 20190511 18:26:12< vn971> jyrkive: some scenario to add for automated testing then? BTW, did I read it correctly that the bug actually happens earlier, but it only leads to crash with 3 simulations in a row? 20190511 18:26:12< vn971> To be honest I wouldn't fully understand even then though. Can you please explain, what is 41? 5000*0.0077 ? 20190511 18:27:04<+wesdiscordbot> 41 is 34+7. The sum of results where the defending unit has rather high HP after the Monte Carlo simulation, suggesting that it had fully healed earlier. 20190511 18:27:42< vn971> ah, ok. 20190511 19:00:04< irker340> wesnoth/wesnoth:1.14 Jyrki Vesterinen 08979a6736 Replace strcmp() with string comparison AppVeyor: All builds passed 20190511 20:26:44< irker340> wesnoth/wesnoth:master Jyrki Vesterinen 6b0ef7e3ce Replace strcmp() with string comparison AppVeyor: All builds passed 20190511 22:49:09< irker340> wesnoth/wesnoth:1.14 Steve Cotton 6a7fb70d06 DiD S09: Unblock the book if one of DV's AppVeyor: All builds passed 20190511 23:56:31-!- stikonas [~gentoo@wesnoth/translator/stikonas] has quit [Ping timeout: 246 seconds] --- Log closed Sun May 12 00:00:48 2019