--- Log opened Sun Jun 24 00:00:07 2018 20180624 00:25:57-!- Appleman1234 [~quassel@121.222.147.211] has quit [Ping timeout: 240 seconds] 20180624 00:40:18-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 00:40:25-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 00:46:00-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 00:46:06-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 01:00:05-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 01:00:15-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 01:16:47-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 01:16:53-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 02:07:31-!- cyphase [~cyphase@unaffiliated/cyphase] has quit [Ping timeout: 256 seconds] 20180624 02:09:15-!- cyphase [~cyphase@unaffiliated/cyphase] has joined #wesnoth 20180624 03:10:58-!- ToBeFree [uid51591@gateway/web/irccloud.com/x-zxxuczqngfbzducd] has joined #wesnoth 20180624 03:11:19-!- ToBeFree is now known as Guest35429 20180624 03:11:41-!- Guest35429 [uid51591@gateway/web/irccloud.com/x-zxxuczqngfbzducd] has quit [Client Quit] 20180624 03:12:39-!- ToBeCloud [uid51591@wikimedia/ToBeFree] has joined #wesnoth 20180624 04:29:05-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 04:29:12-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 04:47:02< janebot> wesnoth: How do I place units in the editor? (by /u/Rock-Golem) https://redd.it/8tfkkq 20180624 04:51:27-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 04:51:34-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 05:16:13-!- ToBeCloud [uid51591@wikimedia/ToBeFree] has quit [Quit: Connection closed for inactivity] 20180624 05:20:01-!- Appleman1234 [~quassel@121.222.147.211] has joined #wesnoth 20180624 05:25:01-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 05:25:07-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 05:29:15-!- DasBrain [~Johannes1@unaffiliated/johannes13] has joined #wesnoth 20180624 05:34:10-!- celticminstrel [~celmin@unaffiliated/celticminstrel] has quit [Quit: And lo! The computer falls into a deep sleep, to awake again some other day!] 20180624 05:49:27<+discordbot2> nope, grunt isnt most efficient one 20180624 05:49:43<+discordbot2> they have 38HP but also notice that their retaliation is also small 20180624 05:50:00<+discordbot2> it depends on what factions you counter and what tactical result you expect from this defense 20180624 05:53:59<+discordbot2> if you expect a good retaliation, spear and elf fighter are better choices 20180624 05:54:46<+discordbot2> if you expect to just hold a villa stead and solid, vs undead you can arguably say wose is unbreakable, while vs other factions shielder dwarf is best choice 20180624 05:55:40<+discordbot2> when enemy composition changes, your most efficient choice of defender varies, there never has been a globally applicable answer 20180624 06:02:41-!- Appleman1234 [~quassel@121.222.147.211] has quit [Ping timeout: 248 seconds] 20180624 06:41:05-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 06:41:11-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 07:12:15-!- ibispi [~quassel@188.246.34.98] has joined #wesnoth 20180624 07:25:34-!- hk238 [~kvirc@unaffiliated/hk238] has joined #wesnoth 20180624 07:34:29<+discordbot2> if you expect a good retaliation, spear and elf fighter are better choices if you expect to just hold a villa stead and solid, vs undead you can arguably say wose is unbreakable, while vs other factions shielder dwarf is best choice when enemy composition changes, your most efficient choice of defender varies, there never has been a globally applicable answer I'm sorry honey!! But, I dont understand because I meant best unit 20180624 07:34:29<+discordbot2> for northerners, and then you mentioned spearmen and elf fighters 20180624 07:34:39<+discordbot2> and woses 20180624 07:34:51<+discordbot2> Yeah I guess those are the best village units for all of wesnoth :)) <3 but what about for northerners? 20180624 07:34:53<+discordbot2> Thanks in advance! 20180624 07:35:02<+discordbot2> *best village holders for northerners 20180624 07:35:19<+discordbot2> Oh yeah thats true, there is no globally applicable answer I suppose! 20180624 07:56:10-!- Appleman1234 [~quassel@121.222.147.211] has joined #wesnoth 20180624 08:17:36<+discordbot2> troll whelps for northerners, perhaps? They have 42hp, so even more 4 than the grunt. Regeneration doesn't really count on villages, but they also have +20% resistance on pierce and blade. 20180624 08:20:44< hk238> hm 20180624 08:21:16< hk238> can someone help me with lua? 20180624 08:21:39<+discordbot2> What kind of help do you need? 20180624 08:22:45< hk238> I'm modifying dark forecast and trying to create a custom version. I'd need somekind of function to assign weather in a different way. I know what it's supposed to do, but I don't know how to implement it with lua 20180624 08:23:11< hk238> like 20180624 08:23:53<+discordbot2> You have to ask more specific questions. "I don't know how o implement it with lua" is just a request that someone else writes the code for you. 20180624 08:24:15< hk238> https://pastebin.com/xtJEvB5u 20180624 08:24:58< hk238> here's the current dark forecast code that assigns weather. So I was thinking I would create a graph which would contain names of weathers, and I'd need a function that creates a path on the graph and then stores it as the weather assignment table 20180624 08:25:06< hk238> but I dont know anything about lua so it's a bit tricky 20180624 08:25:51< hk238> like most of that code can be scrapped then since there's no need for counting which weather occurs 20180624 08:26:47< hk238> graph in this case would mean nodes, and a set for each node which contains a list of nodes which explains what other nodes it's connected to 20180624 08:27:04< hk238> path would then mean generating a sequence of nodes n1,n2,n3 20180624 08:28:01< hk238> like for an example say there are 3 nodes. " Autumn, Winter, Spring ".. Then I woudl have a set that says Autumn is connected to these nodes { Winter } 20180624 08:28:27< hk238> then path would generated by choosing one of the nodes in the set randomly 20180624 08:28:45< hk238> I'd set set up the graph so that it's circular as in summer->autumn->winter->spring->summer 20180624 08:29:01< hk238> and then for each node I'll make map using wesnoth map editor 20180624 08:29:09< hk238> and the code that redraws the map can be reused 20180624 08:29:40< hk238> so I'd just need to change this part but I'm nto sure to start like I can describe what it's supposed to do logically 20180624 08:30:20<+discordbot2> The first thing here would be how to represent the graph. 20180624 08:30:35<+discordbot2> In Lua, the obvious graph representation is with one table per node. 20180624 08:31:12<+discordbot2> Each node then contains an array of possible next nodes. 20180624 08:31:23< hk238> I suppose any kind of organized data storage which allows pointing to other locations works 20180624 08:32:16<+discordbot2> Choosing the next node would also be trivial. 20180624 08:32:38<+discordbot2> local index = wesnoth.random(#current_node.next_nodes) 20180624 08:32:55<+discordbot2> local next_node = current_node.next_nodes[index] 20180624 08:33:42<+discordbot2> And you can then store the path in a table. 20180624 08:34:55-!- Appleman1234 [~quassel@121.222.147.211] has quit [Ping timeout: 256 seconds] 20180624 08:35:09< hk238> hmm so basically the dot operator accesses a property of some data type like here "current_node" is some kind of an object and "next_nodse" is a property associated with it, and the bracket notation refers to accessing the property by index, so it's lik ea list or an array? 20180624 08:35:44<+discordbot2> In Lua, there are no explicit classes. The "data type" is always table. 20180624 08:35:59< hk238> oh hmm 20180624 08:36:08< hk238> so does that mean all properties are accessible by name and index? 20180624 08:36:41< hk238> like "current_node" is a table, and "next_nodes" is by property name "[index]" by index number? 20180624 08:36:44<+discordbot2> Some are accessible by name, others by index. 20180624 08:37:15< hk238> so does that mean they're de facto different kind of objects? 20180624 08:37:16<+discordbot2> It's up to the programmer. You can create any properties you want. 20180624 08:37:41<+discordbot2> No. A Lua table can store both named and indexed properties. 20180624 08:37:50<+discordbot2> You can even have both in the same table if you want. 20180624 08:37:56< hk238> oh so they're separate storages? 20180624 08:38:58<+discordbot2> Not really. You can also access named properties with the indexing syntax: current_node["next_nodes"] 20180624 08:39:00< hk238> okay I was kind of thinking each property would have an index and a name and you could choose which you would use to refer to it, but apparently it's rather you can use either a name or an index to store a property, and whatever is used for the storing process is then what is used to look it up agaIN? 20180624 08:39:35< hk238> hmm but "next_nodes" in this case is.. or is not accesible by actual index number? 20180624 08:39:55<+discordbot2> Yes, exactly. If you store a property with a given index or name, you can later fetch it with the same index/name. 20180624 08:40:10<+discordbot2> Indeed, "next_nodes" is not accessible with a numeric index. 20180624 08:40:30< hk238> hmm alright :d 20180624 08:42:01< hk238> so the data containers are tables, but what about actual values, they're like numbers, strings and so forth? 20180624 08:42:18< hk238> like basically each of these variables is either a table or a value? 20180624 08:42:22<+discordbot2> The actual values can be of several types. 20180624 08:42:48< hk238> you would assign a table or a number the same way, local thing = expression 20180624 08:42:49<+discordbot2> In this case, every value in current_node.next_nodes would also be a table. 20180624 08:42:59< hk238> then the expression's evaluation would decide whether it's a table or a value? 20180624 08:43:34<+discordbot2> Indeed, the Lua syntax doesn't care about if you're dealing with tables or scalar values. 20180624 08:47:49< hk238> okay hmm 20180624 08:47:57< hk238> so can the properties be functions ? 20180624 08:48:26< hk238> like for an example can I define nodes such that they have 3 properties "name" which contains a string that says what weather is, that's then used to load the map 20180624 08:48:46<+discordbot2> Yes, functions are also allowed as properties. 20180624 08:48:53< hk238> indexes values which contain pointers other nodes like node[0] = another node 20180624 08:49:16< hk238> and then I could have a function like node["next"] = function that gets the next node 20180624 08:49:46< hk238> is there a dynamic way to refer to variables like this or a self ? 20180624 08:50:20<+discordbot2> Yes: http://www.lua.org/pil/16.html 20180624 08:52:38-!- Appleman1234 [~quassel@121.222.147.211] has joined #wesnoth 20180624 08:54:40< hk238> hmm so if I understand correctly there is no dynamic pointer such as self or this, but rather you would produce this quality by defining functions that they take the table to be operated on as an argument?! 20180624 08:55:14< hk238> no I didn't read far enough yet 20180624 08:55:14< hk238> :D 20180624 08:57:17< hk238> okay this is slowly coming together for starters I guess I could create a simple graph so that there's not so much to do 20180624 08:58:32< hk238> basically I could write "local summer = {}" this would create a table? 20180624 08:59:15< hk238> then I could write "summer[0] = {}" and that would create another table at index 0? 20180624 08:59:43< hk238> then I could write summer[0].name = "summer" 20180624 08:59:50<+discordbot2> Yes, you can do that. 20180624 09:00:02< hk238> which would create a string value associated with the name property? 20180624 09:00:04<+discordbot2> But note that the Lua convention is that table indices start at 1. 20180624 09:00:13< hk238> oh 20180624 09:00:56<+discordbot2> And yes, summer[1].name = "summer" creates a string property associated with the property "name". 20180624 09:01:36< hk238> okay so can I also do summer[0] = { name = "summer } for the same effect? 20180624 09:01:57< hk238> or is it summer[0] = { self.name = "summer" } or something like that? 20180624 09:02:14<+discordbot2> The first line is correct. 20180624 09:03:02< hk238> so if i wanted each node to have the same kind of next function, is there some way to do that? 20180624 09:03:59< hk238> as in without writing it explicitly for each node 20180624 09:04:10< hk238> I guess that implies using some kind of constructor function or method? 20180624 09:05:22< hk238> the problem here is that while the function would be the same for each node, they would need to have a self expression that refers to the table which the function is assigned to I think 20180624 09:05:45< hk238> hmm is function a value or table? 20180624 09:05:59<+discordbot2> This would be the easiest way to do it: https://gist.github.com/jyrkive/cc88c287479d39d17bedb57778f87cb8 20180624 09:06:13<+discordbot2> (Without having to use metatables, which are a more advanced feature.) 20180624 09:06:28<+discordbot2> Functions aren't tables, they are a different type. 20180624 09:07:19< hk238> okay so they dont have the properties of tables.. looking at that github.. the ":" is used to access a function? 20180624 09:07:53<+discordbot2> Yes. The difference between . and : is that : implicitly passes the table as the first parameter. 20180624 09:08:35< hk238> like so far we have 3 different types of accessing associated properties or values "." for property names [ number ] for indices and [ "name" ] as another way of calling a property by name and then ":" for calling a property by name that is a function? 20180624 09:08:43< hk238> oh that makes sense 20180624 09:09:12<+discordbot2> Yes, that's correct. Those three are all different ways to access table properties. 20180624 09:09:48< hk238> almost have all the required information for implemeting this weather graph :D 20180624 09:09:54< hk238> gotta make some coffee 20180624 09:12:01-!- zookeeper [~lmsnie@wesnoth/developer/zookeeper] has joined #wesnoth 20180624 09:13:40< hk238> hm I wonder if there's some way to associate weights for the nodes to modify how likely each weather change is, but that's not necessary for now 20180624 09:14:06< hk238> so that would make extreme weather less probable, or make maintaining the current weather more probable 20180624 09:17:53< hk238> so if there's a table with a certain number of indices how would I choose a random index? 20180624 09:19:07<+discordbot2> local index = wesnoth.random(#summer) 20180624 09:19:14<+discordbot2> Like I posted earlier. 20180624 09:19:32<+discordbot2> Note that the indices have to start at 1 for it to work. 20180624 09:20:11< hk238> okay so #summer expression evaluates as.. a number or each index? 20180624 09:20:18< hk238> I guess a number if it has to be that way 20180624 09:20:30<+discordbot2> It returns the length of the table. 20180624 09:20:52<+discordbot2> In other words, the number of numeric indices, assuming that they start at 1 and are contiguous. 20180624 09:21:22< hk238> right and wesnoth.random function chooses an integer within that range with that parameter? 20180624 09:21:47< hk238> or is it that it chooses a non-integer but accessing indices works while rounding rational numbers? 20180624 09:22:31<+discordbot2> If you call wesnoth.random with one parameter, it returns an integer that's at least 1 and at most the number you passed. 20180624 09:23:05< hk238> okay thanks for all the help by the way :D 20180624 09:23:17< hk238> crash course in lua :d 20180624 09:25:37< hk238> how about accessing parent of a property? 20180624 09:25:54< hk238> with self included 20180624 09:26:05<+discordbot2> You can't do that in an automatic way. 20180624 09:26:20< hk238> oh 20180624 09:26:25<+discordbot2> If each node needs a reference to the parent node, you need to add it manually. 20180624 09:26:29< hk238> well then this particular implementation doesnt work 20180624 09:26:37<+discordbot2> E.g. summer.parent = spring 20180624 09:26:46< hk238> okay then it works 20180624 09:27:10< hk238> although I should do something that requires writing less parent expressions now 20180624 09:27:56< hk238> basically I was thinking about declaring a table called "weather_graph" and manually write tables inside it like summer, winter, spring, autumn 20180624 09:28:54< hk238> and for each of those I would assign nodes by indexes and to the indexes I'd associate the 3 properties, next function, name of weather and a set which defines the edges of the graph 20180624 09:29:52< hk238> but basically I would just write numbers into the set of edges, and then use the parent style of writing, to access the parent node, and then have the name of the next set be defined in the parent 20180624 09:30:49< hk238> like for an example summer.next_set = .. by the way about the locality of scope 20180624 09:31:11< hk238> like can I access a parallel property directly or do I have to do the parent route with a function expression? this probably wasn't very clear 20180624 09:31:36< hk238> this might not be the most convenient implementation to begin with :D But anyway 20180624 09:33:35< hk238> hm there are too many parent expressions in this implementation 20180624 09:33:41<+discordbot2> Indeed, your question isn't clear. Please post a code example of what you're trying to do with "parallel properties". 20180624 09:36:00< hk238> basically the problem was that I was trying to write a next_node function so that it would access self.edges, which would be a table of numbers for connected edges into the next set. As in for summer, the indices for the autumn set 20180624 09:36:25< hk238> which would then mean I'd need to write a parent expression to figure out which set the node belongs to 20180624 09:36:58< hk238> and for each set I'd need to designate the next set, like for summer.next_set = weather_graph.autumn 20180624 09:37:31< hk238> but I think I can avoid that by just writing the pointers directly 20180624 09:37:58< hk238> so instead of storing the indices in a table I'd just store pointers by manually writing weather_graph.summer[0] 20180624 09:38:48< hk238> the parent system would also work, but then I'd need to write a parent expression for each node. Which would be like one line for each node 20180624 09:39:08< hk238> I dont know sorry I guess I'm still a bit confused 20180624 09:39:23< hk238> but let's see I'll try writing something and then you can call it horrible :D 20180624 09:44:51< hk238> how do I return a value from a function. return? 20180624 09:45:19<+discordbot2> Yes. 20180624 09:47:35< hk238> this is what I got so far: 20180624 09:47:36< hk238> https://pastebin.com/9JUrRWZX 20180624 09:47:39< hk238> does it seem to make sense? 20180624 09:49:28< hk238> I guess I could merge the node declaration and the weather name declarations into single expressions 20180624 09:49:29<+discordbot2> It's mostly okay. Your edge declarations aren't correct, though. 20180624 09:49:38< hk238> what's wrong? :o 20180624 09:49:57<+discordbot2> They should be like this: weather_graph.summer[1].edges = {weather_graph.autumn[1]} 20180624 09:50:16<+discordbot2> You have to create the edges table before indexing it. 20180624 09:50:39< hk238> oh 20180624 09:51:20< hk238> I was kind of assuming that would happen implicitly, but in your example is the node accesible by the index 1? 20180624 09:51:30<+discordbot2> Yes, it is. 20180624 09:51:55< hk238> how come? wasn't it previously said that you'd fetch them the same way you'd store them? But I don't see an expression associating the value to an index? 20180624 09:52:12< hk238> does it implicitly default to index when a property name is not assigned? 20180624 09:52:25<+discordbot2> It's a so-called table constructor expression. 20180624 09:52:44<+discordbot2> Indeed, if you don't specify a property name, it uses indices. 20180624 09:52:53< hk238> alright then :d 20180624 09:53:47<+discordbot2> local fruits = {"apple", "banana", "pear"} 20180624 09:53:59<+discordbot2> And then fruits[1] is "apple". 20180624 09:54:31< hk238> hmm does that mean the node declarations are also wrong? 20180624 09:54:44< hk238> because I'm using the index notation instead of plain table constructor notation with implicity indexing? 20180624 09:55:15<+discordbot2> You create the tables in line 1, so you can index them. 20180624 09:55:19< hk238> like should it be weather_graph.summer = { {} } 20180624 09:55:33< hk238> so that summer[1] is a table? 20180624 09:55:56<+discordbot2> As of line 3, summer is a table. 20180624 09:56:07<+discordbot2> After line 3, summer[1] is also a table. 20180624 09:56:22< hk238> oh okay so the line 1 gets rid of the need for the table constructor notation? 20180624 09:56:58< hk238> hmm hmm that's what you just said, I think 20180624 09:56:59< hk238> :D 20180624 09:57:09<+discordbot2> Yes. You don't need to use the table constructor notation if the table already exists. 20180624 10:05:27< hk238> ahh I'm already exhausted but this should work 20180624 10:06:50<+discordbot2> are there factions based around got? 20180624 10:07:18< hk238> whats got? game of thrones? 20180624 10:07:24<+discordbot2> yes 20180624 10:15:35< zookeeper> there aren't. 20180624 10:15:45-!- Appleman1234 [~quassel@121.222.147.211] has quit [Ping timeout: 260 seconds] 20180624 10:17:51-!- Haudegen [~quassel@178.115.237.87] has joined #wesnoth 20180624 10:43:18-!- Appleman1234 [~quassel@121.222.147.211] has joined #wesnoth 20180624 10:48:16-!- Appleman1234 [~quassel@121.222.147.211] has quit [Ping timeout: 268 seconds] 20180624 10:50:51< Ravana_> 1.14.3 seems to randomly clear chat 20180624 10:51:17-!- claymore [~claymore@unaffiliated/claymore] has joined #wesnoth 20180624 10:57:40< Ravana_> happens most often when someone says something 20180624 11:04:01<+discordbot2> does the mobile app not sync with desktop? 20180624 11:07:32<+discordbot2> what do you mean? 20180624 11:08:50<+discordbot2> like so saves and mods count across platforms 20180624 11:15:58-!- ibispi [~quassel@188.246.34.98] has quit [Ping timeout: 264 seconds] 20180624 11:16:10-!- ibispi [~quassel@188.246.34.98] has joined #wesnoth 20180624 11:35:16< hk238> going to try and continue with this project in a bit 20180624 11:35:49< hk238> are there higher order functions or some built-in table methods or something in lua? Like for an example so I could avoid declaring each node independently, and could use some script for that instead? 20180624 11:35:54< hk238> or method.. not script 20180624 11:36:49<+discordbot2> All table functions in Lua: http://www.lua.org/manual/5.3/manual.html#6.6 20180624 11:37:10< hk238> thanks 20180624 11:37:53<+discordbot2> Developers of the Lua language recommend that you write implementations of higher-order functions (map(), exists() and the like) yourself. 20180624 11:38:47< hk238> right, though I guess you could say that about every language :D 20180624 11:39:38<+discordbot2> Most languages have such functions in their standard library already. Lua doesn't. 20180624 11:39:42< hk238> not that I know much about programming in general, but even in C++ there's like anonymous function implementations :d 20180624 11:40:09< hk238> table sort qualifies as one though :D 20180624 11:40:24<+discordbot2> C++ has the header, for example: https://en.cppreference.com/w/cpp/algorithm 20180624 11:47:32< hk238> I'm trying to figure out how to do this with a bit less work 20180624 11:47:58< hk238> like I was thinking each season would be 4 turns long or something like that, then maybe I would want to have a different set for each phase 20180624 11:48:21< hk238> so you can have something like snowfall increasing during winter, but not so that the map is all snowy on the first winter turn 20180624 11:48:49< hk238> so I was thinking I'd do it so that the index would correspond to a parallel axis, such as water, snow 20180624 11:49:41< hk238> like say summer contains 5 possible weathers, index 5 is very wet, index 1 is very dry.. And then the weather can only change by 1 step. This way you could look for the next set and just randomly choose either same index or +-1 20180624 11:50:20< hk238> then it would also be possible to have te same weather repeat and instead the sets would expand like so that the 3rd winter turn has more possibilities than 2nd winter turn 20180624 11:50:39< hk238> but this would then require checking if in the next set there exists a node that has higher or lower index 20180624 11:50:48< hk238> but that would then require creating these parent things 20180624 11:50:59< hk238> and then writing them for all nodes would be tedious 20180624 11:51:21< hk238> so then I thought maybe I could do something like create a constructor function that creates the parent property for each table 20180624 11:51:48<+discordbot2> I think constructors wouldn't work. 20180624 11:52:01< hk238> and then call the constructor function to populate the tables with nodes that have these parent properties. Then create a shared function that checks using the parent properties the details of the next set 20180624 11:52:07<+discordbot2> Your graph is cyclic, and thus every node needs to have some other node as a parent. 20180624 11:52:23< hk238> oh no that's not the idea here, I think I have explained this incorrectly 20180624 11:52:34<+discordbot2> As a result, when you create the first node, its parent doesn't exist yet. 20180624 11:52:50< hk238> no no the parent doesn't mean what's the previous node in a path 20180624 11:52:55< hk238> but instead what is the set that the node belongs to 20180624 11:53:04< hk238> like for an example "summer" is a set of 5 possible summer weathers, each of them is a node 20180624 11:53:15< hk238> and the parent for each of the nodes, is the set itself, which is a table 20180624 11:53:40< hk238> so when I'm creating new nodes for each of these sets, tables that is, I wonder if I could do it using a function so they get the parent properties assigned automatically 20180624 11:54:14< hk238> the arrangement of the nodes into the sets is arbitrary and not even required, I'm just doing it to make it a bit more readable 20180624 11:54:36< hk238> they could all be in the same table thus there would be no particular parents, but I'm adding the tables for some human readability 20180624 11:55:40< Ravana_> I suggest you define predicate whether transition exists from one state to another 20180624 11:55:53< hk238> like 1st Summer = { s1_weather_1 , s1_weather_2 } , 2nd summer { s2_weather_1 , s2_weather_2 } .. then the parent of "s2_weather_2" would be "2nd summer" 20180624 11:55:53<+discordbot2> Lua doesn't have language-level support for classes or constructors. 20180624 11:56:06< Ravana_> then you could have set of all states and find suitable next states 20180624 11:56:13<+discordbot2> However, you can simply create your constructor as a regular function. 20180624 11:56:28<+discordbot2> And call it like summer = Node.new() 20180624 11:56:40< hk238> ravana yes that's basically what I'm trying to do 20180624 11:57:31< hk238> jyrkive yeah something like that, so I wouldn't have to write node[n].next = next_node 25 times but rather write 1 function that does that for each created node 20180624 11:58:09< hk238> or write summer[1].parent = summer 25 times etc 20180624 12:00:29< hk238> currently I'm thinking there would be like 4 turns of each season, and like 5 parallel weathers for each season, so that would be 20 nodes 20180624 12:00:48< hk238> but probably less than 20 maps since within season the same maps can be used for some states 20180624 12:02:10< Ravana_> parents are not needed 20180624 12:02:22< hk238> how to do that without? 20180624 12:02:56< Ravana_> like I said with previous 2 messages 20180624 12:03:04< hk238> except writing the edges explicitly which is current plan 20180624 12:03:18< Ravana_> not explicitly 20180624 12:03:28< Ravana_> predicate would determine those 20180624 12:04:16< hk238> yes here the predicate function be such that "if the next set contains current index, current index + 1, current index - 1, then those are the possible states" 20180624 12:04:44< hk238> but the problem is to access the next set, I would use "parent of current node" = summer, then summer's next set "autumn", and then check it for that 20180624 12:04:59< hk238> alternatively I could write it for each node, the next set of this node is autumn.. but then I would have write that for 20 nodes again 20180624 12:05:27< hk238> so like there's lots of stuff that would be written explicitly for each node and it's probably better to avoid that somehow 20180624 12:05:56< Ravana_> no need to be that low level - something like return math.abs(this.wetness-other.wetness)+math.abs(this.season-other.season) == 1 20180624 12:06:39< hk238> but here the "wetness" is the index 20180624 12:06:46-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has quit [Quit: Caught sigterm, terminating...] 20180624 12:06:53< hk238> and the other season is something that needs to have a pointer to? 20180624 12:07:11-!- Ivanovic [~ivanovic@p579FB6E5.dip0.t-ipconnect.de] has joined #wesnoth 20180624 12:07:27-!- Ivanovic [~ivanovic@p579FB6E5.dip0.t-ipconnect.de] has quit [Changing host] 20180624 12:07:27-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has joined #wesnoth 20180624 12:07:28< hk238> well I'm a beginner with this so I'm probably following correctly 20180624 12:07:48< hk238> or explaining things in an unclear way 20180624 12:07:56< Ravana_> pointer is needed when you need access to that other table 20180624 12:08:01< hk238> with these current systems I could write this but it would have lots of manual declarations 20180624 12:09:29< Ravana_> one line for each state 20180624 12:09:55< hk238> ? 20180624 12:10:33< hk238> like comparing whether the index is within 1 from the current index? 20180624 12:10:41< Ravana_> not index 20180624 12:10:48< Ravana_> index is low level 20180624 12:10:58< Ravana_> compare values that carry info 20180624 12:11:19< hk238> here I'm just substituting the index for the property since I'm thinking of using only 1 axis 20180624 12:11:29< hk238> but I suppose I could write it explicitly 20180624 12:11:38< hk238> but it doesn't reduce the problem 20180624 12:12:32< Ravana_> something like https://github.com/ProditorMagnus/OrociaRandomMod/blob/master/lua/data_spawn_locations.lua with keys [season, wetness, map] 20180624 12:12:34-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has quit [Quit: Caught sigterm, terminating...] 20180624 12:12:58-!- Ivanovic [~ivanovic@p579FB6E5.dip0.t-ipconnect.de] has joined #wesnoth 20180624 12:13:09< hk238> right okay so you're considering a dynamic weather system? 20180624 12:13:15-!- Ivanovic [~ivanovic@p579FB6E5.dip0.t-ipconnect.de] has quit [Changing host] 20180624 12:13:15-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has joined #wesnoth 20180624 12:13:30< Ravana_> if you don't write it out, then it is dynamic 20180624 12:13:32< hk238> like you would define a location for a river as a set of coordinates, then work on adjacent coordinates? 20180624 12:13:59< Ravana_> no 20180624 12:14:02< hk238> here there's rather an abstract graph that represents how each node is connected to each other, it's basically a circular butterfly graph 20180624 12:14:15< hk238> that connects forwards 20180624 12:14:35< hk238> the sets represent parallel nodes, since they connect forwards, the edges from one node point to the next set 20180624 12:14:44< Ravana_> season and wetness are used to determine if transition exists, and map is data of current node 20180624 12:15:22< hk238> oh I guess you're right it would be better to drop the sets and make them a property of the node instead? 20180624 12:15:37< Ravana_> yes 20180624 12:15:47< hk238> so instead having a table called summer for summer nodes, I would rather just have nodes which have a property, that says summer 20180624 12:16:10< hk238> you could also call that property parent and thus have the same effect 20180624 12:17:28< Ravana_> instead of calling it summer, comparing is easier if you keep it as int 20180624 12:18:11< hk238> that makes sense 20180624 12:19:38<+discordbot2> does Ageless Era have dependencies, or is everything included in it? 20180624 12:21:33< Ravana_> you can map them to and from int though like https://github.com/ProditorMagnus/OrociaRandomMod/blob/master/lua/data_unit_types.lua#L9-L15 20180624 12:21:42< Ravana_> that might make it more readable 20180624 12:22:33< hk238> hmm maybe I'll try writing manually and explicitly 20180624 12:22:40< hk238> and once it works, you can tell me how to do it better 20180624 12:22:49< hk238> I'll stick to the level I can work on. :D 20180624 12:23:20< Ravana_> humpty_hump: yes 20180624 12:24:34< Ravana_> you don't need dependencies, they only have images 20180624 12:28:31<+discordbot2> ffffuuu 20180624 12:28:31<+discordbot2> https://cdn.discordapp.com/attachments/231976805987385345/460420944884924426/Untitled.png 20180624 12:29:05< Ravana_> yes 20180624 12:29:17< Ravana_> if you have space for it, get images too 20180624 12:30:06< hk238> hmm there's going to be 80 nodes now :d 20180624 12:31:58< hk238> okay it's too much work I'll just try and do winter 20180624 12:32:05< hk238> then let's use that as an example 20180624 12:42:57< hk238> although tbh I think that dynamic weather would more fun and also less work 20180624 12:43:03< hk238> :D 20180624 12:46:21< hk238> but it requires more complex programming and I don't have the required skills 20180624 12:50:54< hk238> I do feel like what I'm doing is pretty inane but it's best I can do 20180624 13:00:04< hk238> https://pastebin.com/mkMWf1U3 20180624 13:00:06< hk238> here 20180624 13:00:06< hk238> :D 20180624 13:01:11< Ravana_> I see you decided to go for manual way then 20180624 13:01:34< hk238> yes so you can tell me how to do it better I mean 20180624 13:01:48< hk238> I don't want to stick to this modus operandi forever 20180624 13:01:48< hk238> :D 20180624 13:02:46< hk238> and that's just winter nodes 20180624 13:02:56< hk238> since the other seasons have just one :o 20180624 13:03:23< hk238> so instead of that there could be a function that checks the next set for indices 20180624 13:03:26< hk238> or something like that 20180624 13:03:43< hk238> next season property for each node 20180624 13:04:09< hk238> but all of these would require generating the nodes with a function that assigns some property so I dont have to write it manually 20180624 13:04:22< hk238> which ever property it is :D 20180624 13:05:11< zookeeper> can't say i understand why you've opted to represent pretty much the whole logic as a massive data structure, but i guess it's at least very clear like that. 20180624 13:06:49< hk238> :D 20180624 13:07:06< hk238> the sets are for human readability 20180624 13:07:23< hk238> but I didn't want to do it this way, just that I failed to resolve the solutions in the discussion 20180624 13:07:36< hk238> so can you help me do the same in a more sane way? 20180624 13:07:51< hk238> although I guess this would do :D after all it might work 20180624 13:08:32< hk238> I think it would be more fun to store elevation of each coordinate and then have waterlevel abstraction that rewrites terrain based on water amount, and something like that 20180624 13:16:26< zookeeper> i couldn't help except by starting to write the whole thing myself and seeing what method i end up with, which... i probably won't do :p 20180624 13:18:13< hk238> for starters how could I write a function that assigns the next_node function to each node? :D 20180624 13:18:58<+discordbot2> Doesn't need to be a function. You could easily do it with two nested loops. 20180624 13:19:08< hk238> :D 20180624 13:19:14<+discordbot2> (Five lines of code including the "end" lines.) 20180624 13:19:24< hk238> hm 20180624 13:20:35< hk238> I guess 20180624 13:21:17< hk238> although it might be better to write a function that performs for loops on tables to avoid writing for loops 20180624 13:21:17< hk238> :D 20180624 13:21:29< hk238> but then saying that after this is kind of hypocritical 20180624 13:21:53<+discordbot2> do you need to changes between turns to be so deterministic? 20180624 13:22:23<+discordbot2> I mean, in real live you can get from heavy blizzard to 20 degrees 20180624 13:22:28< hk238> is that a question to me regarding the weather graph? 20180624 13:22:34<+discordbot2> yes 20180624 13:22:59< hk238> that's a possibility but it would require weighing the nodes 20180624 13:22:59<+discordbot2> I'm just wondering if it wouldn't be easier to make it simply select weather based on the current turn and apply effects based on that + the weather from the previous turn 20180624 13:23:03<+discordbot2> IMO, using explicit loops is better than creating a function that performs literally one statement per element. 20180624 13:23:13<+discordbot2> if it was snow and now it is sunny, make water everywhere, for example 20180624 13:23:29<+discordbot2> (and the turn counter is appropriate for spring) 20180624 13:23:35< hk238> I think loops are not good structures 20180624 13:24:14<+discordbot2> They are the most clear way to write "perform this operation to every element". 20180624 13:24:16< hk238> but I guess debating that doesn't make sense :D 20180624 13:25:07< hk238> well okay so 20180624 13:25:26< hk238> let's say I want to create table entries 20180624 13:25:34< hk238> and I could write a for loop 20180624 13:25:52< hk238> and then inside the for loop I would use a counter to perform index specific operations 20180624 13:26:15< hk238> alternatively yoju could write a functio nthat populates a table, use that to initialize them 20180624 13:26:55<+discordbot2> It depends on how much stuff you do inside the function. 20180624 13:27:01< hk238> then you can write a function, that does map() basically which you referred to earlier, it takes a table, and then calls a function with each index of the table, and then fills the values with the evaluations of the functions 20180624 13:27:16<+discordbot2> If you'd end up with less that about ten lines, it probably doesn't even warrant a function of its own. 20180624 13:27:49<+discordbot2> Also, depending on the situation you may consider creating a function that creates one item, and call that function in a loop. 20180624 13:28:01< hk238> this conversation is turning into arch linux or debian, and you're probably the only one of us who actually does programming a lot 20180624 13:29:36< hk238> how would I write a function that takes a table and creates n blank entries into it? 20180624 13:30:53< hk238> like function table_populate, arguments (table, n), modify existing table or return a modified copy of the table :D 20180624 13:30:59<+discordbot2> I think it would be better if the function also created the parent table while it's at it. 20180624 13:33:22<+discordbot2> https://gist.github.com/jyrkive/6b1b32dd5804c6393effbcdf8fb0cad8 20180624 13:33:46< hk238> cool thanks 20180624 13:35:05< hk238> alright then if I wanted to create a mutate_table function that calls another function with index and value, then modifies the table entries with the return value of the functioN? 20180624 13:36:25<+discordbot2> Like I said, I believe an explicit for loop would be more clear. 20180624 13:36:37< hk238> :D 20180624 13:37:19< Ravana_> I do it as https://pastebin.com/rZQqiUSW which gives output like https://pastebin.com/WBL02bGd 20180624 13:37:44< hk238> thanks ravana you're awesome 20180624 13:37:56<+discordbot2> well, nothing stops you from experimenting with the code, but probably you should really consider jyrkive's suggestions 20180624 13:38:46<+discordbot2> If you really want mutate_table, it isn't hard to write: https://gist.github.com/jyrkive/0e5f417e21972362392a17ecdf25039e 20180624 13:38:56< hk238> yeah I think this discussion is like there's no right answer exactly 20180624 13:39:26< hk238> cool 20180624 13:40:13< zookeeper> you can talk programming theory all day long, or you can just write a few if statements and get something working immediately. i guess your methodology leans closer to the former :> 20180624 13:40:49< hk238> :D it's more like I don't know any lua yet and I'm trying to learn.. and I did actually write things, but it was very.. unnecessarily low level and explicit 20180624 13:41:01< hk238> so with this discussion I'm learning to do things in a better way 20180624 13:41:49<+discordbot2> Also, while functional programming is a good thing in general, not every loop should be replaced with higher-order constructs. 20180624 13:41:51< zookeeper> oh, okay. i thought the big table stuff was all you had at this point. 20180624 13:41:53< hk238> btw where does the mutate_table function assign the new values? I'm having trouble understanding that :o 20180624 13:41:59<+discordbot2> low level is not necessary bad 20180624 13:42:04< hk238> zookeeper that is all I got :D 20180624 13:42:27< hk238> but I'm trying to abstract it.. thankfully ravana already did that and I'll have to look into it closely :d 20180624 13:42:42<+discordbot2> There are some obvious things like map(), exists() and filter() that makes sense... but for_each() tends to be just a different way to write loops in the end. 20180624 13:42:51<+discordbot2> *make 20180624 13:43:26< zookeeper> abstraction doesn't necessarily make code better. you can also needlessly abstract things that can be expressed shortly and simply as straightforward low-level code. 20180624 13:43:32<+discordbot2> My implementation of mutate_table() assumes that it's passed a table of tables. 20180624 13:44:20<+discordbot2> The function will mutate the table, and the change will be visible in the parent table because it doesn't have its own copies of the child tables. 20180624 13:45:03< hk238> I'm having trouble seeing where the actual value is assigned though? Is it implicit in this expression somehow? :o 20180624 13:45:28<+discordbot2> You don't need to assign if the value is a table. 20180624 13:46:07< hk238> I'm sorry I don't understand :o 20180624 13:46:30< hk238> btw is this like python that indentation counts or is it just for viewing? 20180624 13:46:44< hk238> at least there's "end" 20180624 13:47:06< hk238> so I guess not :D 20180624 13:47:39<+discordbot2> https://gist.github.com/jyrkive/e6d66eeda6900a7418a4eacfea85b5b8 20180624 13:49:23< hk238> at least there's an explicit assignment 20180624 13:49:29< zookeeper> personally, i find code easier to read (or, rather, understand) the less abstraction it has. but i've never really had to deal with large codebases or anything else where a lot of abstraction might actually be necessary. 20180624 13:49:31< hk238> what does ipairs do? :o 20180624 13:49:34<+discordbot2> No, there is not. 20180624 13:49:48<+discordbot2> The loop doesn't have a line parent[i] = v 20180624 13:50:33<+discordbot2> Regarding ipairs(), see http://www.lua.org/pil/4.3.5.html 20180624 13:50:49< hk238> yes but the mutation is explicit with v.prop = "asdf" 20180624 13:52:36< hk238> okay I think I understand somewhat 20180624 13:52:42<+discordbot2> Another version of the same code, now using mutate_table(): https://gist.github.com/jyrkive/e6d66eeda6900a7418a4eacfea85b5b8/5b68e9abc962411467aff82850c4f1ee08ce4d7e 20180624 13:54:20< hk238> hm is it an anonymous function inside the function parameters? :o 20180624 13:54:28<+discordbot2> Yes. 20180624 13:54:53<+discordbot2> And like I said, in this case it's just a different syntax for a loop. 20180624 13:55:08<+discordbot2> Doesn't really improve anything. 20180624 13:55:22< hk238> I agree it is essentially the same so how does this work exactly 20180624 13:55:45<+discordbot2> It calls the anonymous function for every child table. 20180624 13:55:58<+discordbot2> The function mutates the child table, then returns. 20180624 13:56:05<+discordbot2> That's all there is to it. 20180624 13:56:23< hk238> does ipairs create a copy of table.. how does that work? I'm having trouble seeing this exactly 20180624 13:56:54<+discordbot2> No. ipairs() creates a so-called iterator. 20180624 13:57:26< hk238> this is weird :D 20180624 13:57:54<+discordbot2> Iterators are a quite advanced Lua topic. IIRC, the Angry Birds Stella codebase (a couple hundred thousand lines of Lua code) didn't have even as much as one custom iterator type. 20180624 13:58:48<+discordbot2> Really, the only thing you need to know about Lua iterators is how to use pairs() and ipairs(). 20180624 13:59:03< hk238> yeah I'm totally having trouble seeing how this flows 20180624 13:59:11< hk238> like what exactly does ipairs() evaluate to 20180624 14:00:08< hk238> and is it that "for" v,i "in" "do" is like.. assign the indices and values of what follows after "in" to each call of "do" ? 20180624 14:00:11<+discordbot2> My recommendation: don't worry about it, and just use ipairs() when you need to loop over a table with numeric indices. 20180624 14:00:39< hk238> how does the for in do structure work without ipairs? or is it necessary to use them? 20180624 14:01:01<+discordbot2> Yes. It means "in the loop body, assign the current index to i and the current value to v". 20180624 14:01:48<+discordbot2> The "for-in structure" (called "generic for") won't work if you remove the call to ipairs() or pairs(). 20180624 14:02:11< hk238> I was sort of anticipating something like that :D 20180624 14:02:17<+discordbot2> (There can also be some other iterator function there, but those two are overwhelmingly the most common.) 20180624 14:02:26<+discordbot2> *functions 20180624 14:04:40< hk238> so in otherwords " for in " requires an iterator, which is a function, that iterates.. is the "do" specific to "for in" or is it a general expression in lua? 20180624 14:06:38<+discordbot2> It's also used in other loops (numeric for, while). 20180624 14:10:39< hk238> hmm okay but I still don't understand how the mutate_table function assigns values.. is it that the iterator defaults to assigning new values if the do expression evaluates to a non-assigning statement like a value? 20180624 14:11:40<+discordbot2> Look again at the example about how to use mutate_table(). 20180624 14:11:52<+discordbot2> mutate_table() doesn't assign values. 20180624 14:11:58<+discordbot2> The function you pass to it does. 20180624 14:12:42< hk238> oh I see 20180624 14:13:06< hk238> it would be better to have it assign the value returned by the function though 20180624 14:13:36<+discordbot2> Because the table can also contain scalar values? 20180624 14:14:41<+discordbot2> (A reminder that in my usage example the function does NOT return anything. If you assign the return value, you end up clearing the parent table.) 20180624 14:15:01< hk238> wait what? :D 20180624 14:15:31<+discordbot2> function(v) v.prop = "asdf" end 20180624 14:15:41<+discordbot2> There isn't the word "return" anywhere. 20180624 14:15:49< hk238> yes but if there was 20180624 14:15:57< hk238> why would it clear the parent table? :o 20180624 14:17:20<+discordbot2> The function returns nothing, and then mutate_table() assigns that nothing into the table, removing the reference to the value that was there. 20180624 14:18:15< hk238> so is the do in in ipairs implicitly assigning some value after all? 20180624 14:18:30<+discordbot2> No, it's not. 20180624 14:18:46< hk238> well why does it clear the table then? :D 20180624 14:18:53< hk238> this is really strange 20180624 14:19:10< Ravana_> you do not need to understand functional programming concepts to create wesnoth addons 20180624 14:19:29< hk238> sorry ravana I'm just trying to learn lua here :D 20180624 14:20:44< hk238> I want to see how it works and it seems to work in a strange way and so far I have not yet understood what it does exactly... but at least it seems to be passing pointers and not copies. Is that true for values also or just tables? 20180624 14:21:02<+discordbot2> Here is an example: https://gist.github.com/jyrkive/82f70c709b17b1489895c7b452358461 20180624 14:21:27<+discordbot2> Note that dangerous_mutate_table() does assign the return value like you suggested. 20180624 14:21:45< hk238> yes that's the point exactly in fact it's called mutate_table to signal that it's "dangerous" :D 20180624 14:22:08<+discordbot2> Only tables are passed by reference. Other variables are passed by value. 20180624 14:22:12< hk238> meanwhile it's much more dangerous to do the mutation of the value inside some other function 20180624 14:22:17< hk238> okay :o 20180624 14:24:11< hk238> can you create a copy of the value inside the mutate_table function? to avoid problems with a pointer being passed? 20180624 14:24:27<+discordbot2> Why would you do that? 20180624 14:24:31< hk238> although I guess it's not possible 20180624 14:24:43<+discordbot2> The entire point of mutate_table() is mutating the table. 20180624 14:24:53< hk238> yes and it's also control where it happens 20180624 14:25:00<+discordbot2> Explicitly copying child tables to avoid mutating the table is counterproductive. 20180624 14:25:19< Ravana_> if you want to replace value, then it is called map function 20180624 14:25:26< hk238> yeah I guess so 20180624 14:25:40< hk238> it's pretty much the point ravana :D 20180624 14:26:06< hk238> although here called mutate_table since it's supposed to modify the existing table instead of creating a new copy 20180624 14:26:28< hk238> but then it's kind of weird that it's not actually mutating the table, but instead expecting that the function to be called does the assignment 20180624 14:27:48<+discordbot2> think of it as of mutate_table (with the function you provide) 20180624 14:28:35< hk238> what about if the table has values and does not consist of nested tables 20180624 14:28:41< hk238> then you can't use the mutate_table function at all? 20180624 14:29:06<+discordbot2> In that case you need the dangerous_mutate_table() variant I posted. 20180624 14:29:18< hk238> yes :D 20180624 14:29:33<+discordbot2> It's slightly clumsier to use because now your mutate function needs to return the new value. 20180624 14:30:02<+discordbot2> (My toy example is the worst-case scenario, where adding the return statement doubles its length from 1 to 2 lines.) 20180624 14:30:44< hk238> by the way what happens if you call a function with too many parameters? 20180624 14:31:06<+discordbot2> Lua will just discard the extra parameters. 20180624 14:31:59< hk238> so basically you could write local function add_one (v) return v + 1 end, then use mutate_table(table, add_one) ? 20180624 14:32:43< hk238> even though mutate_table calls add_one with two parameters? 20180624 14:32:59<+discordbot2> Yes, it would work. 20180624 14:34:06< hk238> what happens if the thing being passed on to the function is of the wrong type 20180624 14:34:15< hk238> like if it actually is a table and you're trying to add one to it? 20180624 14:34:30<+discordbot2> It raises an error. 20180624 14:34:45< hk238> okay I guess that's good D: 20180624 14:41:40< hk238> I have to go shopping this weather project ended up being a little more arduous than expected :D But at least I know some lua now :o 20180624 14:42:14< hk238> I'll try and study ravana's code when I get back and see if I can use that :o thanks for help again :o 20180624 15:20:50-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has quit [Quit: Caught sigterm, terminating...] 20180624 15:21:17-!- Ivanovic [~ivanovic@p579FB6E5.dip0.t-ipconnect.de] has joined #wesnoth 20180624 15:21:30-!- Ivanovic [~ivanovic@p579FB6E5.dip0.t-ipconnect.de] has quit [Changing host] 20180624 15:21:30-!- Ivanovic [~ivanovic@wesnoth/developer/ivanovic] has joined #wesnoth 20180624 16:16:52-!- celticminstrel [~celmin@unaffiliated/celticminstrel] has joined #wesnoth 20180624 16:45:59-!- Appleman1234 [~quassel@121.222.147.211] has joined #wesnoth 20180624 17:20:55-!- Haudegen [~quassel@178.115.237.87] has quit [Remote host closed the connection] 20180624 17:58:23-!- gfg [~androirc@tmo-116-79.customers.d1-online.com] has joined #wesnoth 20180624 18:03:31< Ravana_> after 7 days uptime, bot crashed from invalid game index (insert to length+1). Stats at end: Game stats: Current games: 39, Seen games: 6208, User stats: Current users: 101, Seen users: 1960 20180624 18:03:46-!- Haudegen [~quassel@178.115.237.87] has joined #wesnoth 20180624 18:13:54-!- `ani` [~molgrum@databur.st] has quit [Ping timeout: 260 seconds] 20180624 18:17:09-!- `ani` [~molgrum@databur.st] has joined #wesnoth 20180624 18:21:00-!- hk238 [~kvirc@unaffiliated/hk238] has quit [Quit: KVIrc 5.0.0 Aria http://www.kvirc.net/] 20180624 18:35:29-!- phoe [~phoe@origin.ksi.ii.uj.edu.pl] has quit [Remote host closed the connection] 20180624 19:17:07-!- gfg [~androirc@tmo-116-79.customers.d1-online.com] has quit [Remote host closed the connection] 20180624 19:26:58-!- gfg [~androirc@tmo-116-79.customers.d1-online.com] has joined #wesnoth 20180624 19:36:08-!- ibispi [~quassel@188.246.34.98] has quit [Remote host closed the connection] 20180624 19:36:20-!- Appleman1234 [~quassel@121.222.147.211] has quit [Ping timeout: 260 seconds] 20180624 19:47:05-!- Appleman1234 [~quassel@121.222.147.211] has joined #wesnoth 20180624 19:57:56-!- claymore [~claymore@unaffiliated/claymore] has quit [Quit: Leaving] 20180624 20:22:34-!- Appleman1234 [~quassel@121.222.147.211] has quit [Ping timeout: 256 seconds] 20180624 20:28:36-!- gfg [~androirc@tmo-116-79.customers.d1-online.com] has quit [Read error: Connection reset by peer] 20180624 20:53:15-!- gfg [~androirc@ersc154.goemobile.de] has joined #wesnoth 20180624 20:57:39-!- gfgt [~androirc@hsvpn23a.hotsplots.net] has joined #wesnoth 20180624 20:58:57-!- gfg [~androirc@ersc154.goemobile.de] has quit [Ping timeout: 256 seconds] 20180624 21:18:57-!- gfgt [~androirc@hsvpn23a.hotsplots.net] has quit [Ping timeout: 240 seconds] 20180624 21:21:01-!- gfgt [~androirc@2001:638:60e:834:2975:fe68:8e18:bd48] has joined #wesnoth 20180624 21:30:50-!- zookeeper [~lmsnie@wesnoth/developer/zookeeper] has quit [Ping timeout: 260 seconds] 20180624 21:52:00-!- gfgt [~androirc@2001:638:60e:834:2975:fe68:8e18:bd48] has quit [Remote host closed the connection] 20180624 21:53:50-!- gfgt [~androirc@2001:638:60e:834:2975:fe68:8e18:bd48] has joined #wesnoth 20180624 22:16:30-!- gfgt [~androirc@2001:638:60e:834:2975:fe68:8e18:bd48] has quit [Ping timeout: 245 seconds] 20180624 22:34:51-!- Haudegen [~quassel@178.115.237.87] has quit [Read error: Connection reset by peer] 20180624 22:36:21-!- Appleman1234 [~quassel@121.222.147.211] has joined #wesnoth 20180624 22:48:35-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has quit [Remote host closed the connection] 20180624 22:48:42-!- janebot [~Gambot@unaffiliated/gambit/bot/gambot] has joined #wesnoth 20180624 23:15:51-!- ToBeCloud [uid51591@wikimedia/ToBeFree] has joined #wesnoth --- Log closed Mon Jun 25 00:00:07 2018