00:17:27 Unstable branch on cbro.berotato.org updated to: 0.32-a0-422-g28b100f618 (34) 00:55:38 Monster database of master branch on crawl.develz.org updated to: 0.32-a0-422-g28b100f618 01:40:54 Unstable branch on crawl.kelbi.org updated to: 0.32-a0-422-g28b100f618 (34) 01:40:54 Unstable branch on crawl.kelbi.org updated to: 0.32-a0-422-g28b100f618 (34) 01:46:58 Fork (bcrawl) on crawl.kelbi.org updated to: 0.23-a0-5140-g5775ae71e1 01:46:58 Fork (bcrawl) on crawl.kelbi.org updated to: 0.23-a0-5140-g5775ae71e1 02:00:35 03SentientSupper02 07https://github.com/crawl/crawl/pull/3529 * 0.32-a0-461-gcf89016ee5: Let vampire serpents keep their fangs 10(18 seconds ago, 1 file, 4+ 2-) 13https://github.com/crawl/crawl/commit/cf89016ee5c7 02:15:26 Fork (bcadrencrawl) on crawl.kelbi.org updated to: 0.03-2314-g1a819b34ad 02:15:26 Fork (bcadrencrawl) on crawl.kelbi.org updated to: 0.03-2314-g1a819b34ad 04:31:03 Experimental (bcrawl) branch on underhound.eu updated to: 0.23-a0-5140-g5775ae71e1 05:12:56 Unstable branch on crawl.akrasiac.org updated to: 0.32-a0-422-g28b100f (34) 09:35:40 03elliptic02 07* 0.32-a0-423-g123bbc5fe1: Don't apply -Move on Coglin if there are no monsters left 10(8 minutes ago, 1 file, 9+ 0-) 13https://github.com/crawl/crawl/commit/123bbc5fe1a8 09:36:56 <06p​leasingfungus> @qwqwqwqwqwqwqw thanks! i was thinking about making move commands with -Move action into a ‘run’ that rests off the -move and then takes the move (if no enemies are visible, as with other runs), but this change seems better than status quo 🙂 09:37:46 <13q​wqwqwqwqwqwqw> that could work too yeah, might be a better solution 09:41:49 <13q​wqwqwqwqwqwqw> there's been some suggestion of making movement commands act as waiting when you have -Move (similarly to movement when you are webbed or whatever) but I'm unsure whether that's a good idea 09:42:09 <13q​wqwqwqwqwqwqw> webs are a bit different because moving is specifically how you get out of them, but here lots of actions will work 09:43:16 <13q​wqwqwqwqwqwqw> so it feels not so great to eat a player's manual move in combat like that 09:45:09 <13q​wqwqwqwqwqwqw> really I'm still not sure -move is a great idea (not a large enough drawback to be worth it, and ideally I think we wouldn't penalize attacking at all) but might as well do easy changes to try to make it less annoying in testing 09:46:53 <06p​leasingfungus> sure 09:47:11 <06p​leasingfungus> and i know there’s at least one player who loves -move 09:47:22 <06p​leasingfungus> which is more than i’ve seen for Rev :p 09:47:58 <06p​leasingfungus> i should try to summarize some of the chat from last night that i’m scrolling through now 09:48:14 <06p​leasingfungus> discussion of alternative downsides for coglin, replacing -move and/or rev 09:48:41 <06p​leasingfungus> no gold, no god, no scrolls, no wands brought up 09:49:52 <06p​leasingfungus> (i do vaguely wonder if no scrolls would be a funny combination with dual wielding - don’t have to worry about finding enough enchant weapon for both? - but probably has a bunch of issues, too much variance depending on artefacts found) 09:51:51 <13q​wqwqwqwqwqwqw> no scrolls just too huge a drawback I think, in principle I guess you could just forbid a subset of scrolls (e.g. enchant/brand scrolls) 09:52:43 <06p​leasingfungus> as fo does, in a sense 09:52:47 <06p​leasingfungus> ??scrolls 09:52:48 <04C​erebot> scrolls[1/2]: acquirement, amnesia, blinking, enchant armour, enchant weapon, fear, fog, holy word (0.28-), identify, immolation, magic mapping, noise, poison (0.29+), silence, summoning, teleportation, torment, brand weapon, vulnerability. 09:53:04 <06p​leasingfungus> rip butterflies 09:53:20 those are weird downsides. no god would make them demigods but with dualwielding instead of good stats 09:53:24 <06p​leasingfungus> not super excited about this 09:53:41 <06p​leasingfungus> yeah, the thought re no god was that it would be a good option if we didn’t like dg 09:53:44 <06p​leasingfungus> but we do like dg 09:53:50 <13q​wqwqwqwqwqwqw> yeah 09:54:27 <06p​leasingfungus> there was discussion of reverse attractivitis - pulling you toward enemies on sight. concerns of unfairness, suggestions of applying haste on pull (?) 09:55:08 <06p​leasingfungus> i’d actually thought about ‘reverse attractivitis’ before i came up with attractvitis as implemented 09:55:44 <06p​leasingfungus> my concern was both that it’d feel unfair and that players would be encouraged to do very silly things to avoid it - messing around with shout luring and such 09:56:47 <06p​leasingfungus> that said, it could be a good xom action, maybe? 09:58:19 <06p​leasingfungus> ok, there was discussion of nerfing damage as well, but folks seemed happier with glass cannons 09:58:57 <06p​leasingfungus> next suggestion was occasional badmuts - downsides that rotate as you level 09:59:13 <06p​leasingfungus> possibly with different pools for different levels 09:59:29 <06p​leasingfungus> you fix your heaters and then the auxiliary motivator unit breaks, etc 09:59:38 <13q​wqwqwqwqwqwqw> the glass cannon approach does make the species somewhat similar to tengu (instead of lots of auxes and good apts you get dual-wielding) 09:59:47 03gammafunk02 07[brokenarts] * 0.32-a0-421-gd69e765334: feat: Simplify formulas for artefact properties 10(2 hours ago, 1 file, 3+ 2-) 13https://github.com/crawl/crawl/commit/d69e765334aa 09:59:53 <06p​leasingfungus> also a little vs-ish 10:00:05 <06p​leasingfungus> problem with having 27 species :p 10:01:06 <06p​leasingfungus> rotating downsides is actually very reminiscent of a suggestion that mumra (!) made the day before - wanted you to be able to pick custom upgrades instead of level up str/int/dex 10:01:15 <13q​wqwqwqwqwqwqw> after musing about rotating badmuts for a bit I think my conclusion was that it probably isn't a good idea but that rotating goodmuts could work on a different species (think meaningfully different from Ds) 10:02:18 <13q​wqwqwqwqwqwqw> just because I suspect a lot of people hate playing with certain specific badmuts and will find being forced to for 2 or 4 XLs not fun 10:03:59 <13q​wqwqwqwqwqwqw> you could give the player some control over which badmuts they get (similar to ru) but it's not obvious to me that there's a good way to make that work as a significant drawback on an otherwise strong species 10:04:31 <13q​wqwqwqwqwqwqw> think ru only works because you have a large enough pool of stuff and apply different weights to different things, etc 10:04:32 <06p​leasingfungus> ru remains the god of ‘sac design space’ 10:05:09 <06p​leasingfungus> yeah, my feeling about both the good and bad versions of this is that we might have used up the design space already, between ds and ru 10:05:23 <06p​leasingfungus> (though i could be wrong!) 10:05:32 <13q​wqwqwqwqwqwqw> I think on the good side of things you'd want to have it be a relatively minor upside 10:05:39 <13q​wqwqwqwqwqwqw> and fairly normal muts 10:05:58 <09g​ammafunk> @qwqwqwqwqwqwqw If you have a moment to take a look at this commit and some smallish distributional changes I make in this commit, would be appreciated. It's a tweak to simplify quality and numbers of bad props for randarts. Stats for before and after this change can be seen here: https://dpaste.com/ANWMAU5DP It looks like it's a bit of a buff for quality, but the simplification of the distribution seems sensible as a starting point. 10:05:58 Mostly in terms of not using max/min to make distributions effectively non-binomial and to reduce the amount of random variable nesting 10:06:35 <09g​ammafunk> and for anyone else interested for that matter 10:06:49 <13q​wqwqwqwqwqwqw> hm, I think it's a good feature of the current system that with certain props you can't get really small values 10:06:53 <13q​wqwqwqwqwqwqw> AC+1 etc 10:07:00 <13q​wqwqwqwqwqwqw> are you talking about removing that? 10:07:08 <13q​wqwqwqwqwqwqw> since that doesn't sound like the right direction to go to me 10:07:22 <09g​ammafunk> no, this is not about the level of those props (actually AC isn't in the pool, but that's besides the point) 10:07:51 <13q​wqwqwqwqwqwqw> (yeah, replace with slay+1 or str+1 etc) 10:07:53 <09g​ammafunk> this is about 1) the quality itself which dictates how many props are added (or can be enhanced) and 2) the number of bad props added 10:07:58 <13q​wqwqwqwqwqwqw> ah 10:08:22 <13q​wqwqwqwqwqwqw> why is there a big table with lots of specific props in it then 😛 10:08:43 <09g​ammafunk> that's just the per-prop output that the stat summarizer makes 10:08:46 <13q​wqwqwqwqwqwqw> sorry, just not sure what anything in the paste you sent means 10:08:59 <09g​ammafunk> I think the top of those tables is what's most of interest here 10:09:10 <06p​leasingfungus> more other-channel summaries: bountyhuntersax really, really wants dual wielding to have higher delay, with a specific formula 10:09:13 <09g​ammafunk> not the details of the specific props 10:09:37 <06p​leasingfungus> so that skill costs of mindelaying dual wielded 1hs end up similar to that for mindelaying 2handers 10:09:42 <09g​ammafunk> before: > Max # of props = 6, mean = 2.88, median = 3 > Max # of good props = 6, mean = 2.46, median = 2 > Max # of bad props = 2, mean = 0.42, median = 0 > Max (good - bad) props = 6, avg # = 2.04 after: Max # of props = 6, mean = 3.27, median = 3 Max # of good props = 6, mean = 2.79, median = 3 Max # of bad props = 2, mean = 0.47, median = 0 Max (good - bad) props = 6, avg # = 2.32 10:09:58 <13q​wqwqwqwqwqwqw> sounds complicated and also boring 10:10:15 <06p​leasingfungus> as i’ve told them, i’m pretty low on this - seems complex, potentially tricky to communicate to players, hard to evaluate, and pushes against the premise of the species 10:10:29 <06p​leasingfungus> or what elliptic said, yes 10:11:11 <13q​wqwqwqwqwqwqw> like I think if possible it would be good to keep the "get more than 2h damage with less than 2h skill" aspect of things 10:15:34 <04d​racoomega> Nodding along with a lot of this (and definitely that. If there's anything that's been straightforwardly resonant about Coglin mechancs, it's probably that) 10:16:32 New branch created: pull/3578 (2 commits) 13https://github.com/crawl/crawl/pull/3578 10:16:33 03dolorous02 07https://github.com/crawl/crawl/pull/3578 * 0.32-a0-424-g8239a42ed4: Make setting monsters' gods its own function. 10(40 minutes ago, 1 file, 93+ 86-) 13https://github.com/crawl/crawl/commit/8239a42ed4a3 10:16:33 03dolorous02 07https://github.com/crawl/crawl/pull/3578 * 0.32-a0-425-g5ac9ab71d6: Simplify setting monster gods a bit. 10(17 minutes ago, 1 file, 4+ 1-) 13https://github.com/crawl/crawl/commit/5ac9ab71d67a 10:16:43 <13q​wqwqwqwqwqwqw> @gammafunk I don't understand your commit message, 1 + binomial(6, 30) certainly has a higher expected value than max(1, binomial(7, 30)), no? 10:17:15 <09g​ammafunk> right, that's an error, sorry 10:17:31 <13q​wqwqwqwqwqwqw> like it just looks like a straightforward buff 😛 10:17:36 <04d​racoomega> Was wondering a little if some of the 'there's a large burden to have a large list of badmuts and this risks upsetting players who dislike non-overlapping sets of them' could be improved by simply not being random with it? Have a series of badmuts that predictably are rotated through (and probably even start with some lower-impact one so that levelling up might be less likely to feel like it makes you strictly worse?) But not 10:17:36 convinced this is more interesting at this point than just finding some permanent downside that feels good and sticking to that >.> 10:19:06 <13q​wqwqwqwqwqwqw> difference between 1 + binomial(6,30) and max(1, binomial(7,30)) is that the first option always sets the first roll to 1, while the second option leaves the first roll at its normal 30% chance of 1 and otherwise only raises it to 1 if all 6 other rolls are 0 10:19:27 <09g​ammafunk> well, we could adjust the p parameter to lower it down to the same/similar mean, but it seemed to me that it's better to have an actual binomial than use max, since the original one was simply trying to avoid a value of 0, which is possible without making it non-binomial 10:19:38 <13q​wqwqwqwqwqwqw> seems fine, sure 10:19:41 <06p​leasingfungus> yes - ‘we’re having trouble finding one good downside, so let’s require ten!’ 10:20:17 <04d​racoomega> I mean, you're not entirely wrong, but also sometimes multiple simpler or non-permanent things is easier than one 10:20:43 <13q​wqwqwqwqwqwqw> taking 0.2 would do that roughly 10:20:54 <04d​racoomega> Wondering a little about leaning into the 'glass cannon' bit in a way that isn't just some amount of frail or negative resistance and wondering if it's possible to give them like... side-effects to being hit with elemental damage (maybe is a bit like drac cold-blooded, but different and applying to more things?) Okay, I admit, part of me was also thinking about them just bursting into fire every now and again as they take damage in 10:20:54 combat >.>; 10:21:04 <04d​racoomega> 'Overheating' 10:21:30 <13q​wqwqwqwqwqwqw> this does decrease the variance of randart quality though 10:21:47 <06p​leasingfungus> bursting into sticky flame?! 10:21:51 <13q​wqwqwqwqwqwqw> which is probably a nerf since the player chooses the best gear found 10:22:11 <13q​wqwqwqwqwqwqw> so raising the average a bit seems okay, let's see 10:22:30 <04d​racoomega> Fuel leak! 10:22:41 <06d​olorous_84348> Thematically, multiple badmuts tied to exo-suits make me think more of gremlins than goblins. 10:22:44 <06p​leasingfungus> sounds deadly. 10:23:03 <04d​racoomega> I mean, it might be. Damage and duration can be scaled arbitrarily. (It was just an off-the-cuff thought that made me chuckle, though) 10:25:31 <04d​racoomega> Otherwise, I dunno. Like, Weak from fire damage, Slow (movement?) from Elec damage, something-something that isn't just slow from Cold (because dracs already do that). Maybe resistible with the appropriate resistance, maybe not. Just wondering if there's an 'effectively more vulnerable' that doesn't feel the same as 'have less health / take more damage' 10:26:33 <04d​racoomega> Since weapon-based glass-cannon doesn't feel like a bad thing for them to be, but I fear that doing it mostly from the perspective of traditional fragility does skew a little closer to a couple things we already have. (Which may be unavoidable, but may not be) 10:26:54 <06p​leasingfungus> think there’s ‘effectively have less health, but it feels worse because the damage is spikier and more random?’ :p 10:27:12 <06p​leasingfungus> i don’t quite understand why we’re trying to push further toward glass cannon 10:27:23 <06p​leasingfungus> since dual wielding is already a push in that direction 10:28:16 <06p​leasingfungus> and without felid extra lives or deep elf style killing-stuff-before-it-can-retaliate, super glass cannon doesn’t seem like a viable roguelike strategy 10:29:12 <06p​leasingfungus> (some argue that deep elf isn’t great either :p) 10:29:14 <04d​racoomega> I mean, do you actually think that is more dangerous than previously mentioned frail 2 rather than less? 10:29:22 <04d​racoomega> I was assuming less 10:29:23 <06p​leasingfungus> oh, i don’t think i’d want either 10:29:34 <06p​leasingfungus> sorry, should’ve said 10:30:08 <06p​leasingfungus> but if i had to pick, i’d expect randomly ‘set on fire’ seems more likely to cause feel-bad moments 10:31:12 <04d​racoomega> Well, sure. That wasn't entirely serious compared to some flavor of the pondering the second suggestion ^^; 10:32:07 <04d​racoomega> To be clear, this is just the 'thinking out loud' end of design discussions and not "I am specifically advocating for a proposal" sort of design talk. It's just, when it seems sort of widely vague what we want to do at all, the former seems to have a chance of hitting something useful? 10:32:20 <04d​racoomega> Every now and again 10:34:33 <06p​leasingfungus> oh, sure 10:34:40 <06p​leasingfungus> no bad ideas in brainstorming 10:35:13 <13q​wqwqwqwqwqwqw> I took a look at some numbers and I'd suggest p=0.21 or p=0.22, either one raises the mean slightly while keeping the number of randarts with >= 3 or >= 4 properties (respectively) fixed. The main effect in either case is to make having only 1 property and having a very large number of properties both rarer 10:35:59 <02M​onkooky> I'm still kind of in the camp of 'change sid choice to a pick your poison' 10:36:00 <13q​wqwqwqwqwqwqw> er where by property I mean quality, I guess I don't know if that's exactly the same thing 10:36:24 <02M​onkooky> but don't have clear ideas re poison selection 10:36:42 <13q​wqwqwqwqwqwqw> I guess quality isn't actually the number of good properties 10:36:52 <13q​wqwqwqwqwqwqw> but rather the difference in numbers? hm 10:37:58 <13q​wqwqwqwqwqwqw> I should actually look at the full code instead of just the snippet visible in the commit 10:38:02 <09g​ammafunk> yeah, got it re: the p value, and right it's slightly more complicated than the number of properties in terms of what quality is: cpp // We then consider adding bad properties. The better the artefact, the // more likely we add a bad property, up to a max of 2. We start by // assuming we'll allow one good property per quality level and an // additional one for each bad property. int bad = 0; if (fixed_bad < 2) 10:38:03 bad = binomial(2 - fixed_bad, 300 - 20 * max_quality / quality, 1000); int good = max(quality + fixed_bad + bad - fixed_good, 0); This is what's in my branch, where it only differs from trunk in that these "fixed bad" (and "fixed good") props can't exist 10:38:56 <09g​ammafunk> but essentially it uses another binomial to roll up to 2 bad props, which this depending on quality, with higher quality meaning more bad props (true for trunk as well but with a different binomial-based dist) 10:39:17 <13q​wqwqwqwqwqwqw> what are fixed_bad and fixed_good actually 10:39:32 03dolorous02 07https://github.com/crawl/crawl/pull/3578 * 0.32-a0-426-g2c9ebe3c3c: Simplify parameters for setting monster gods. 10(3 minutes ago, 1 file, 25+ 24-) 13https://github.com/crawl/crawl/commit/2c9ebe3c3c99 10:39:34 <13q​wqwqwqwqwqwqw> like are they always 0 for you 10:39:37 <09g​ammafunk> those are the numbers of bad/good props that were specified as fixed by the item spec (a new feature in this branch) 10:39:44 <13q​wqwqwqwqwqwqw> ah 10:39:45 <09g​ammafunk> so they are 0 in normal cases yes 10:41:41 <13q​wqwqwqwqwqwqw> so quality is equal to #good - #bad always, and the number of bad depends on quality by the weird formula above 10:41:50 <09g​ammafunk> right 10:41:52 <13q​wqwqwqwqwqwqw> I wonder whether having it depend on quality really is necessary 10:42:09 <09g​ammafunk> exactly, this is also what I was hoping you would have an opinion on 10:42:18 <09g​ammafunk> I made a new parameterization of it that seemed more sensible but 10:42:27 <09g​ammafunk> the scheme seems weird in the first place 10:42:52 <09g​ammafunk> not sure why it's desireable to have higher quality randarts have more bad props, I guess to prevent them from being too good generally? 10:44:28 <13q​wqwqwqwqwqwqw> so currently the average number of badprops is 0.3*(1 + quality/5) when quality <= 5, and a bit less than that for quality 6/7 but those are quite rare so I'm not going to worry about it 10:45:42 <13q​wqwqwqwqwqwqw> and with what you have above, it is 2*(0.3 - 0.14/quality) 10:45:55 <13q​wqwqwqwqwqwqw> which is a completely different formula 😛 10:46:09 <13q​wqwqwqwqwqwqw> (if vaguely the same scale) 10:47:53 03dolorous02 07https://github.com/crawl/crawl/pull/3578 * 0.32-a0-426-gd01a77c1f8: Adjust parameters for setting monster gods. 10(11 minutes ago, 1 file, 25+ 24-) 13https://github.com/crawl/crawl/commit/d01a77c1f8f9 10:47:54 <13q​wqwqwqwqwqwqw> I feel like it would be fine to just replace that dependence with a constant really 10:48:18 <13q​wqwqwqwqwqwqw> will mean more randarts with 3 good and 2 bad properties and such, but that's fine 10:50:49 <13q​wqwqwqwqwqwqw> current average number of bad properties is about 0.43 I believe, so you could replace the 0.3-0.14/quality with 0.21 or something around there 10:52:05 <13q​wqwqwqwqwqwqw> i.e. bad = binomial(2 - fixed_bad, 21) or so 10:52:26 <09g​ammafunk> ok 10:52:43 <09g​ammafunk> ends up being a similar p to that you suggested for quality itself 10:52:59 <09g​ammafunk> but hopefully both distributions are a bit easier to reason about 10:53:04 <13q​wqwqwqwqwqwqw> yeah, funny coincidence 10:53:53 <13q​wqwqwqwqwqwqw> I guess maybe should think a bit more about the effects of making this independent 10:56:05 <13q​wqwqwqwqwqwqw> I think it likely means more randarts overall with only 1 badprop, and fewer with 2 (or 3 which is possible now but super super rare) 10:57:14 <13q​wqwqwqwqwqwqw> and the randarts with badprops are lower quality on average, but also lower quality randarts have more goodprops on average (since more likely to have something bad) 10:57:45 <13q​wqwqwqwqwqwqw> eh, it's not obviously a good or bad change to me, or a positive or negative change for the player 10:58:06 <13q​wqwqwqwqwqwqw> seems fine to just pick a number and not worry about it a large amount 10:58:25 <13q​wqwqwqwqwqwqw> no reason to think current numbers are optimally calibrated or anything 10:58:56 <09g​ammafunk> yeah, formula author didn't state why they wanted more bad props on higher quality randarts in the first place 10:59:16 <09g​ammafunk> although I haven't looked in the commit history; suspect this is a pretty old decision 10:59:20 <13q​wqwqwqwqwqwqw> it's a relatively weak effect anyway 10:59:46 <13q​wqwqwqwqwqwqw> like they could have made # of bad props roughly proportional to # of goodprops, but they didn't 11:00:34 <13q​wqwqwqwqwqwqw> difference between quality 1 and quality 7 is twice as many badprops 11:08:49 <06p​leasingfungus> iirc the quality logic dates to a rewrite by ebering (?) maybe 5-8 years back 11:08:58 <06p​leasingfungus> around the time of +Twste 11:11:46 <09g​ammafunk> I should have checked 11:12:27 <09g​ammafunk> Well 5-8 years ago sounds like not ebering 11:12:40 <09g​ammafunk> Twstr was a Lasty joint 11:13:08 that sounds about right 11:20:43 <06p​leasingfungus> yeah, sorry, think it was probably lasty then 11:20:46 <06p​leasingfungus> it’s been a while 11:40:13 <06p​leasingfungus> %git b0940ecfe9d 11:40:14 <04C​erebot> Lasty * 0.16-a0-3815-gb0940ecfe9: Redo randart good/bad property generation to reduce property spam (9 years ago, 1 file, 25+ 8-) https://github.com/crawl/crawl/commit/b0940ecfe9d6 11:40:21 <06p​leasingfungus> nine years is basically 5-8 years 11:45:44 <02M​onkooky> 5 - 8 = 9 12:11:36 <09h​ellmonk> Quick maths 12:18:05 <09g​ammafunk> Amazing to think that, when that commit was made, I wasn't even 12 years old yet... 12:19:57 <02M​onkooky> anyone know where the order shouts are to be found 12:20:14 <02M​onkooky> (don't go hunting if it's not top of head knowledge) 12:20:36 <09g​ammafunk> Is it shout.cc? 12:20:46 <06p​leasingfungus> the order? 12:20:54 <04d​racoomega> issue_orders, in fact 12:20:55 <06p​leasingfungus> are you talking about the enum? 12:21:01 <04d​racoomega> (In shout.cc) 12:21:01 <06p​leasingfungus> oh 12:21:11 <02M​onkooky> beaut, thanks 12:21:17 <06p​leasingfungus> i thought you meant the order, not the orders 12:22:02 <06p​leasingfungus> what a blunder 12:23:56 <02M​onkooky> so a brief perusal of pet_target makes me think this is sometimes intended only to be changed by order shouts, and sometimes meant to be a general ai thing? 12:24:13 <02M​onkooky> like, // Don't swap places if the player explicitly ordered their pet to // attack monsters. if ((mover.friendly() || moved.friendly()) && you.pet_target != MHITYOU && you.pet_target != MHITNOT) { return false; } 12:25:38 <04d​racoomega> Yes, it's a bit muddled 12:25:48 <04d​racoomega> As I talked about a bunch the other day in #dcss 12:26:13 <02M​onkooky> yeah 12:27:43 <02M​onkooky> So, it looks like every friendly monster always uses your pet_target 12:27:58 <04d​racoomega> I mean, there is no other pet_target 12:28:01 <04d​racoomega> There's just the one 12:28:03 <02M​onkooky> that is, every mon will all be trying to attack the same guy 12:28:05 <02M​onkooky> yeah 12:28:31 <02M​onkooky> but this isn't really the behaviour that seems to happen in practice 12:28:39 <04d​racoomega> Note: monster behaviour only switches their targets passively back to pet_target if they don't have some other foe 12:29:06 <02M​onkooky> wait 12:29:08 <04d​racoomega> The attack order will immediately set foe for all nearby friendlies, but otherwise they only look at your pet target if they aren't already targeting something else 12:29:40 <02M​onkooky> handle_behaviour gets called for every mon every game turn right 12:29:47 <04d​racoomega> Yes 12:29:54 <04d​racoomega> (Sometimes more often, even, I think?) 12:30:17 <02M​onkooky> // Set friendly target, if they don't already have one. // Berserking allies ignore your commands! if (isFriendly && (mon->foe == MHITNOT || mon->foe == MHITYOU) && !mon->berserk_or_frenzied() && mon->behaviour != BEH_WITHDRAW && !mons_self_destructs(*mon) && !mons_is_avatar(mon->type)) { if (you.pet_target != MHITNOT) mon->foe = you.pet_target; else 12:30:18 set_nearest_monster_foe(mon, true); } 12:30:18 <04d​racoomega> As a few other situations will directly call it, but it's always called at least once before their action 12:30:37 <02M​onkooky> this is I think the code for actually making a monster attack your target 12:30:47 <04d​racoomega> I believe so, yes 12:31:16 <02M​onkooky> and I'm pretty sure that this means that a mon will only target pet_target for one frame of handle_beh 12:31:33 <04d​racoomega> But like... keep in mind. Some monsters come into view and pet_target isn't anything yet, so they'll pick a random target instead. 12:31:36 <02M​onkooky> because the second time this is called, it has a foe and will call set_nearest_monster_foe instead 12:31:48 <04d​racoomega> No, no 12:31:55 <04d​racoomega> Look at the second line of the larger condition 12:32:03 <04d​racoomega> It only calls the inside if they have no foe at all 12:32:22 <02M​onkooky> oh yeah ok I see 12:32:33 <04d​racoomega> So, group of monsters comes into view, your pet_target isn't anything yet, your allies pick a nearby random enemy, and from that point forward stick to that unless something changes it 12:32:34 <02M​onkooky> got bamboozled by the nesting 12:32:36 <04d​racoomega> (Such as them being hiit) 12:32:37 <02M​onkooky> because I can't read 12:34:24 <06p​leasingfungus> reading is impossible 12:34:54 c++ is incomprehensible anyway 😛 12:38:22 <02M​onkooky> what is monster::mindex() about 12:38:55 <04d​racoomega> That's the index into the internal monster array 12:39:04 <04d​racoomega> Basically 'the current internal ordering of monsters on a floor' 12:39:26 <04d​racoomega> Not safe as a permanent ID since it can change. (mid is a unique id that will not change) 12:39:49 <02M​onkooky> ...why is you.pet_target beng set to mon->mindex() so often 12:40:02 <04d​racoomega> But it's how some things are temporarily pointed at each other. (Everything used to use mindex back in the ancient days, and many were slowly converted over to mid, but some internal things still use mindex) 12:40:11 <04d​racoomega> Foes in general use mindex 12:40:31 <02M​onkooky> sure ok yeah this makes enough sense 12:41:05 <04d​racoomega> Then there are special values like MHITNOT and MHITYOU 12:41:26 <04d​racoomega> (Since the player is not a monster, and the abstract concept of nothingness is also not a monster) 12:41:38 <04d​racoomega> But they are treated like special mindex values 12:41:39 <02M​onkooky> yeah 12:42:32 <02M​onkooky> hm. It feels to me like 'should I attack someone' should be fully decoupled from 'who should I attack' 12:42:55 <04d​racoomega> I tried to improve the behavior of 'stop attacking', but admittedly still through the old general pet_target system 12:43:12 <04d​racoomega> (It still helps that specific order a bunch, but a wider solution would be good in other ways) 12:44:43 <02M​onkooky> yeah, I'm looking at a lot of the 'set you.pet_target when X occurs' and most of them seem to be in place to 'wake' your allies 12:45:27 <02M​onkooky> I guess the big question- if I airstrike some schmuck from the middle of my zombie horde, do I want my zombies to target that specific guy 12:45:39 <02M​onkooky> or just go from quiescent to murdery 12:46:22 <04d​racoomega> I think it's mostly fairly reasonable for them to prioritize the thing you're attacking, in absense of a reason to do otherwise (such as you telling them something else or them not being able to reach them easily, etc.) 12:48:31 <02M​onkooky> How about situations where it's like @z...W ..D... 12:48:40 <02M​onkooky> and I airstrike W 12:48:59 <04d​racoomega> How did you end up in that situation without the z already targeting something (such as possibly the D)? 12:49:05 <06p​leasingfungus> i also wonder this 12:49:07 <04d​racoomega> Unless you'd specifically told them not to attack 12:49:30 <02M​onkooky> I'm not really thinking with respect to the current behaviour 12:49:36 <13q​wqwqwqwqwqwqw> (this whole discussion is why I don't like allies) 12:50:17 <04d​racoomega> Well, whether or not this is with respect to exactly the current behavior, I'm not sure of any default behavior where something gets that close to you without your zombies being aggro unless it either teleported in or you told them not to attack 12:50:21 <13q​wqwqwqwqwqwqw> (so if there is a way to clean everything up to work more simply/naturally that would be great!) 12:50:38 <02M​onkooky> Sure- but should they retarget to W? 12:50:56 <04d​racoomega> I mean, they currently do not do this. Are you asking if they should retarget? 12:50:59 <02M​onkooky> yes 12:51:01 <06p​leasingfungus> imagining a crawl version in which elliptic becomes an ally player... 12:51:07 <06p​leasingfungus> what a beautiful dream 12:51:21 <04d​racoomega> I mostly vote no, since for melee allies this often means spending turns not doing useful things when they may have already been doing useful things 12:51:26 <02M​onkooky> (Also one such situation where this can occur without a target in current crawl is a dispersal trap) 12:51:28 <04d​racoomega> At least, that's my first impression here 12:51:53 <04d​racoomega> Like, I probably don't want melee allies to start ignoring nearby things they were already hitting, just because I'm hitting something else 12:52:15 <04d​racoomega> If I really felt it important to focus on a specific target, I think I would say so? 12:52:24 <02M​onkooky> yeah, that's my feeling 12:52:25 <04d​racoomega> If one target was much more important than whatever else they might be doing 12:52:32 <04d​racoomega> In most battles, this is not really the case, I think 12:52:50 <04d​racoomega> Maybe the thing you're airstriking is 'more important', but not so important as to waste turns to switch target 12:53:29 <06r​egret-⸸nde※> just imagining a hyper-simplified version of crawl where every ally one can get is solely an immobile spelless statue with an axe 12:53:45 <02M​onkooky> Back to the 'somehow we are here and z has no target when you airstrike W'- in this case should z choose to focus W? 12:55:01 <13q​wqwqwqwqwqwqw> fwiw the most common complaint I had with allies in my most recent beogh game was not actually "you are attacking the wrong thing" but actually "please stop running off and moving away from me all the time to fight stuff near edge of los, I'm tired of telling you to retreat/move towards me every 3 turns" 12:55:13 <04d​racoomega> I do agree 100%, by the way 12:55:31 03PleasingFungus02 07* 0.32-a0-424-g4368416496: Fix: allow Vhi's with -Move (Drazool) 10(2 minutes ago, 1 file, 0+ 3-) 13https://github.com/crawl/crawl/commit/436841649633 12:55:31 <04d​racoomega> This is sort of the downside of the change a couple years back to auto-aggro on things 12:55:41 <04d​racoomega> They become rather reckless in ways that are awkward 12:56:07 <02M​onkooky> part of why I'm askin this, in fact- because lowering the amount of auto-aggro makes this a much bigger deal 12:57:15 <04d​racoomega> I did actually briefly experiment with only auto-aggroing on things that were within several tiles (instead of full LoS) but I found it surprisingly less comfortable feeling than I expected, at least in part because it wasn't always immediately clear when and why they were doing things. 12:57:17 <02M​onkooky> Like, right now I'm toying with the idea of allies having states of follow/retreat/aggro/other? and then separate from that deal with targetting 12:57:49 <04d​racoomega> (I was concerned it would make Ancestors feel worse) 12:58:06 <04d​racoomega> Of course, an ancestor hurling themselves to their death is more of a nuissance than a real problem a lot of the time 12:59:19 <06r​egret-⸸nde※> could constantly show little icons of "attacking" versus "not attacking yet" and only use the AI for apostles since they revive slower than any other non-bound allies, but this would be constant information overload at the three-apostles point 13:00:03 <13q​wqwqwqwqwqwqw> honestly even when I don't really care about an ally dying (with summons or whatever) I still don't really like the auto-aggro as it currently works, feels like sometimes ally/monster movement patterns just end up meaning that the scary monster can ignore my ally and move towards me 13:00:54 <04d​racoomega> This definitely happens sometimes, yeah 13:00:55 <13q​wqwqwqwqwqwqw> obviously there were serous issues with not having auto-aggro too 13:01:48 <13q​wqwqwqwqwqwqw> I suspect it's not possible to make ally AI be such that I would be happy with allies, so it's best to try to make people less picky than me happy instead 😛 13:02:13 <02M​onkooky> so my main goal here is to make ally AI more predictable 13:02:25 <02M​onkooky> with secondary goals of being not extremely dumb 13:02:47 <04d​racoomega> I mean, the current auto-aggro is pretty predictable 13:02:51 <02M​onkooky> is it? 13:02:53 <04d​racoomega> But not necessarily in a good way 13:03:11 <13q​wqwqwqwqwqwqw> it's awkward when there are multiple enemies and it picks the "wrong one" 13:03:20 <13q​wqwqwqwqwqwqw> but not sure that's something that can be made more predictable 13:03:29 <04d​racoomega> Well, it does prioritize based on 'closest'. Random after that. 13:03:53 <04d​racoomega> But I doubt there are metrics for breaking ties of closest enemy that feel more 'predictable' (even if there are maybe metrics that are more effective) 13:04:04 <13q​wqwqwqwqwqwqw> you could try using the same metrics as autofight? 13:04:04 <02M​onkooky> sure, I guess it's everything else about the mon behaviour that makes it unpredictable 13:04:22 <13q​wqwqwqwqwqwqw> closest first, break ties by injury level, then by threat level, etc 13:04:29 <04d​racoomega> Hmmm... that might be reasonable 13:04:42 <04d​racoomega> I do think a much larger problem is just 'immediately running off to engage stuff' in general, of course 13:04:44 <13q​wqwqwqwqwqwqw> not sure how much difference that would make unless it changes target sometimes when one monster gets closer or whatever 13:05:06 <04d​racoomega> And trying to find a way to make that feel less fiddly without also feeling like they dumbly don't respond to things 13:05:09 <13q​wqwqwqwqwqwqw> hitting the most injured adjacent monster when there are multiple adjacent monsters could help maybe 13:05:22 <02M​onkooky> the initial auto-aggro is fine enough, but mons changing target happens so often that it's functionally random 13:05:22 <04d​racoomega> (I have watched several people deliberately manage the auto aggro by just 'back away, recall, back way, recall' over and over 13:05:34 <13q​wqwqwqwqwqwqw> yes that is what I did on beogh 😛 13:05:35 <02M​onkooky> yeah I've done that 13:05:44 <13q​wqwqwqwqwqwqw> a combination of that and telling them to stop attacking or retreat 13:05:50 <04d​racoomega> I've done it a bit, (though less so than several people I watched) 13:06:11 <04d​racoomega> Anecdotally, I think I am more likely than most to charge in and try to shield them with myself ^^; 13:06:21 <13q​wqwqwqwqwqwqw> I wished I could do that more 13:06:39 <13q​wqwqwqwqwqwqw> like I think it would have worked to do that on an MD with an axe and heavy armour 13:06:41 <13q​wqwqwqwqwqwqw> but sadly I was a troll 13:07:07 <04d​racoomega> Yeah, like I think them being a little gung-ho is okay, but beyond a certain point it's just going to get you killed to try and intervene that way 13:07:14 <13q​wqwqwqwqwqwqw> and doing that was just repeatedly getting me almost killed yes 13:08:19 <13q​wqwqwqwqwqwqw> I do think on some level it would best to have as few ways for the player to micromanage allies as possible - it's similar to how beogh is a lot better with not being able to pick gear for your orcs 13:08:29 <04d​racoomega> I do wonder about that 'ally attack state' thing monkooky mentioned earlier. And whether there's some way we could handle a transition from 'standby' to 'actively engaging' better 13:08:42 <13q​wqwqwqwqwqwqw> like having 1 possible command instead of 4 or whatever would be an improvement if it didn't incentivize other worse behavior 13:08:44 <04d​racoomega> Yeah, I don't want to 'improve' this by more and more micromanagement commands, to be clear 13:09:07 03dolorous02 07* 0.32-a0-425-gefc72b7d41: Make setting monsters' gods its own function. 10(4 hours ago, 1 file, 93+ 86-) 13https://github.com/crawl/crawl/commit/efc72b7d4135 13:09:07 03dolorous02 07* 0.32-a0-426-g937e6280d3: Simplify setting monster gods a bit. 10(3 hours ago, 1 file, 4+ 1-) 13https://github.com/crawl/crawl/commit/937e6280d38a 13:09:07 03dolorous02 07* 0.32-a0-427-g448f42529f: Adjust parameters for setting monster gods. 10(3 hours ago, 1 file, 25+ 24-) 13https://github.com/crawl/crawl/commit/448f42529fd7 13:09:38 <04d​racoomega> (I wonder if some of the old bad parts of pre-auto-aggro behaviour were actually influenced by some bugs I fixed that made allies not respond to you doing things some times when they should have) 13:09:50 <13q​wqwqwqwqwqwqw> my favorite allies are trog ones because I can't tell them what to do 😛 13:10:10 <06p​leasingfungus> yeah, the trick with removing ally management commands is to avoid ally management becoming more fiddly with player movement, etc 13:10:26 <13q​wqwqwqwqwqwqw> yeah 13:10:34 <06p​leasingfungus> do you remember old old old yred and steering ghouls over polearms 13:10:38 <06p​leasingfungus> those were the days. 13:10:53 <06p​leasingfungus> (possibly just old old yred? not sure about the counter) 13:10:58 <13q​wqwqwqwqwqwqw> no because I never bothered with that, just waited for my bone dragons and tried not to think about the other allies 13:11:04 <13q​wqwqwqwqwqwqw> and then I cast haste spell on the bone dragons 13:11:06 <13q​wqwqwqwqwqwqw> good times 13:11:14 <06d​olorous_84348> Also steering them over something they ate that dropped a hide, so they could wear it as armor. 13:11:25 <06p​leasingfungus> @dolorous_84348 nice simplification! I wonder if i should put monster gods into the YAML - what do you think? 13:12:47 <06p​leasingfungus> could still have a few special cases in code, eg the critical 1/7 atheist orcs 13:13:05 <06p​leasingfungus> but could do something like god: elyvilon in apis.yml, etc 13:13:31 <06d​olorous_84348> Thank you. And that does sound good, along with the special cases in code. 13:14:15 <04d​racoomega> Like, imagine that allies are by default in a 'standby' state when you have no pet target. They will not auto-aggro on things at full range until an action of the player changes this, such as the player attacking something. Or rather, they will not move towards enemies in a way that also moves them further away from the player while in standby state? (But can still shoot at things if they're in range, etc.) and only change this 13:14:15 behavior if the player starts to attack things or enemies get sufficiently close? (Obviously, summons when cast still auto-aggro) 13:14:53 <04d​racoomega> Because like... the problem isn't really allies 'targeting' enemies. The problem is that it's impossible for them not to bee-line towards things they're targeting 13:17:21 <04d​racoomega> So, say, a hexer could still haste or cast mass confusion, but wouldn't rush headlong into something unless the player themselves started shooting it, or moved sufficiently towards it (or told them to) 13:17:45 <02M​onkooky> this was along the lines of what I was thinking- though not all the way considered yet 13:17:47 <04d​racoomega> And we do something about the whole 'switch target when attacked' thing and just make that not apply that way to allies 13:18:20 <04d​racoomega> Since like... if that enemy was much closer to them than the other enemy, they would presumably already be targeting it unless they had a good reason not to be? 13:18:41 <02M​onkooky> to me the big advantage of using an attack state is, instead of switch targets when attacked, you just set them to attack mode 13:19:08 <02M​onkooky> since I'm reasonably certain that's the goal with the current switching targets when attacked 13:19:17 <09g​ammafunk> some of these issues make me think a lot of qw, which likewise in many ways has simple bee-lining behavior with caveats about repositioning out of bad terrain or ducking out of los of ranged attackers. having qw support ranged brought the shortcomings of the melee approach to the fore, so I implemented a retreating algorithm that essentially has qw try to find the best position nearby where the fewest monsters could melee it, but also 13:19:18 considering how far it would have to retreat to do so versus how much it would improve the number of monsters that will eventually melee it at its current position 13:19:34 <09g​ammafunk> this algorithm is far from perfect and is still a WIP, but it helped tremendously 13:19:51 <09g​ammafunk> makes me wonder if having allies use some behaviours like this could ever be an improvement 13:20:04 <09g​ammafunk> like a very common thing I have to do with summons is, when monsters are funneling through a choke point 13:20:16 <09g​ammafunk> use tf to get my summons to move closer to me so they don't file into a corridor 13:20:32 <09g​ammafunk> and then ta when monsters are close to the choke point, so my summons block the choke point 13:20:55 <09g​ammafunk> if allies could take aspects of self preservation in mind it could improve things 13:21:02 <02M​onkooky> I end up using tr ta a lot in that sort of circumstance 13:21:17 <02M​onkooky> think that particular issue is one I'm not gonna try to tackle this pass though? 13:21:18 <09g​ammafunk> these algorithms are more complicated than anything we'd want to give hostile monsters 13:21:39 <09g​ammafunk> but for allies having more complexity could actually improve the experience potentially 13:21:39 <02M​onkooky> since this is already gonna be a big complicated rewrite in the best of plans 13:22:03 <09g​ammafunk> yeah I'm more musing about future possible directions based on coming into this conversation a bit late 13:22:16 <04d​racoomega> I mean, even simply separating allies out to have some kind of action state indepdent of normal monster behavior that updates as the player does things is a non-trivial amount of work 13:22:25 <04d​racoomega> But could certainly improve the experience, in theory 13:22:52 <09g​ammafunk> yeah, I can definitely tell you that just trying to implement stuff like this directly in lua for qw was pretty non-trivial (and as I said it's not complete/perfect) 13:23:13 <09g​ammafunk> never mind trying to bring it to the delightful crawcode that is mon-behv.cc and mon-act.cc etc 13:23:25 <02M​onkooky> yeah I'm at least a little aware what I'm getting into 13:23:33 <04d​racoomega> Also: allies likely shouldn't prioritize their own health too highly either (unlike qw). Like, you want them to not be foolishly reckless, but also you'd rather they bite the bullet than you 13:23:52 <09g​ammafunk> right, they don't want exactly the same concerns, but they probably have similar concerns 13:23:54 <04d​racoomega> So any more complex behaviour would need to strike a balance 13:23:56 <02M​onkooky> this still probably is an act of incredible hubris, but I am at least a little aware how much this is gonna involve 13:24:10 <09g​ammafunk> like the chokepoint thing is actually as much relevant to damage efficiency as it is to self preservation 13:24:16 <04d​racoomega> Yes 13:24:28 <04d​racoomega> And comes up all the time 13:25:24 <04d​racoomega> I would really love it if monster behaviour code internally was less of a mess, too, but this has always been what felt like the tallest order on 'things I wish were different' 13:26:11 <04d​racoomega> And I'm a bit worried that shoehorning in ally changes like this without at least some reorganization might only increase that mess. 13:26:26 <09g​ammafunk> someone just needs to quit their job and rewrite all of crawl from the ground up 13:26:31 <04d​racoomega> This isn't me saying not to do it, but rather that some care is needed, I think, in where and how they are placed, code-wise 13:29:40 <06p​leasingfungus> i will simply rewrite it in Go. 13:30:18 <04d​racoomega> I look forward to not being able to read it ^^; 13:31:28 <06p​leasingfungus> if you can read c, you can read go. 13:31:36 <06p​leasingfungus> it's not like i'm talking about Clojure or something 😛 13:32:49 <04d​racoomega> (I know nothing about Go) 13:33:01 <04d​racoomega> I don't think I've ever seen any of it. I just assumed 😛 13:33:45 <06p​leasingfungus> https://gobyexample.com/structs random example Go code 13:34:01 <06p​leasingfungus> start studying this for the impending Go Crawl rewrite, coming March 2044 13:34:56 <06p​leasingfungus> (it would compile so fast.......... ;_;) 13:36:05 <04d​racoomega> God, that's a low bar T.T 13:36:47 <04d​racoomega> "Why yes, I would like to wait another 15 minutes after correcting one (1) typo in a header file" 13:40:27 <02M​onkooky> hm. Right now still tryin to get a thorough grasp on how things currently work 13:41:15 <02M​onkooky> and not clear to me what exactly you.pet_target does 13:56:54 <02M​onkooky> wow what a tangled web this is 14:07:44 <09h​ellmonk> Pokemon go to a better programming language 14:10:41 <06d​olorous_84348> Am I missing something, or does wizard mode's item creation not have a way to create orbs other than the orb of Zot? 14:13:23 <05i​coson> you can do it with &%, but yeah it looks like &o doesn't have an orb option 14:13:56 <05i​coson> ah they work as armour 14:14:15 <05i​coson> under [ 14:14:31 <06d​olorous_84348> Thank you. 14:46:03 <06p​leasingfungus> yeah, the orb object type has nothing to do with orbs 14:46:07 <06p​leasingfungus> orbs and orbs are totally different. 14:46:28 <06p​leasingfungus> context is that Go was created specifically because Google's C++ code was taking way way way too long to compile 14:47:12 Conversely I'm told Rust's performance is often excellent because by the time your program has compiled you own a faster computer to run it on 14:47:23 <06p​leasingfungus> 😂 14:48:22 <06p​leasingfungus> section 5 of https://go.dev/talks/2012/splash.article ("Dependencies in C and C++") might seem familiar to folks here 14:49:02 <06p​leasingfungus> > In 1984, a compilation of ps.c, the source to the Unix ps command, was observed to #include 37 times by the time all the preprocessing had been done. Even though the contents are discarded 36 times while doing so, most C implementations would open the file, read it, and scan it all 37 times. Without great cleverness, in fact, that behavior is required by the potentially complex macro semantics of the C 14:49:02 preprocessor. how many times do you think we #include, say, player.h...? 14:52:01 <02M​onkooky> headers surely are the best of language features 14:54:58 <06d​olorous_84348> One last question. Trying to get umbras working for Pan lords again, and there's some logic that disables cloud rings for friendly Pan lords so they won't harm the player. Since umbra will make it harder to attack whatever's within it if the player doesn't have a source of night vision (Yred worship or wielding a source of umbra), should that be banned for all friendly Pan lords as well, or only for friendly Pan lords if the 14:54:58 player doesn't have night vision? 14:56:48 <06d​olorous_84348> (Part of the reason the last attempt failed was that half of the ghost demons are initialized outside mon.place.cc, and that I also was doing a check in the wrong place.) 14:56:58 <06d​olorous_84348> (But I almost have it working.) 15:02:05 <04d​racoomega> I hate the existence of headers so much T.T 15:02:47 <06d​olorous_84348> (As it is, Pan lords without umbra will lack nightvision and have the same accuracy problems, so if you're in a Ziggurat floor full of Pan lords, there's effectively now a strategy where if you keep umbraed Pan lords in a position where their umbras cover other Pan lords, you may get an advantage.) 15:03:06 <06d​olorous_84348> (The umbras are, at most, radius 1, though.) 15:03:28 <04d​racoomega> I feel pretty sure there is no situation where keeping a pan lord alive for its umbra would grant an actual advantage 15:03:50 <04d​racoomega> The advantage is miniscule compared to the disadvantage of a pan lord who wants to kill you remaining alive 15:04:40 <04d​racoomega> (Umbra's effect on to-hit is pretty minor in general, but certainly very minor compared to the power of even a low-tier pan lord) 15:05:42 <06d​olorous_84348> Thanks for the info. So it sounds like it may not need to be banned for friendly ones, either? 15:06:22 <04d​racoomega> I don't personally see any reason to 15:07:01 <06d​olorous_84348> Okay. 15:36:37 New branch created: pull/3579 (1 commit) 13https://github.com/crawl/crawl/pull/3579 15:36:38 03dolorous02 07https://github.com/crawl/crawl/pull/3579 * 0.32-a0-428-gc1f27a075f: Let ghost demons have umbras. 10(44 minutes ago, 8 files, 36+ 2-) 13https://github.com/crawl/crawl/commit/c1f27a075f18 15:38:44 03dolorous02 07https://github.com/crawl/crawl/pull/3579 * 0.32-a0-428-g4c54ea4ec9: Let ghost demons have umbras. 10(46 minutes ago, 8 files, 36+ 2-) 13https://github.com/crawl/crawl/commit/4c54ea4ec92a 15:53:29 <06d​olorous_84348> For binary compatibility purposes, the umbra radius is currently saved as a short. Although maybe it could be saved as a byte instead, since the umbra in practice shouldn't ever get very large (even though it's -1 by default)? 15:54:03 <06d​olorous_84348> It's an int in the code, in any case. 15:55:23 <06d​olorous_84348> I'm not that familiar with the tags code. 16:03:38 <04d​racoomega> I think that while one could imagine it made sense to marshall as a byte, that it's not worth actually adding save compat code to change this at this point 16:04:02 <04d​racoomega> For the tiniest of size savings 16:04:58 <06d​olorous_84348> Okay. It's still a pull request, so any save compat code tweaks aren't in yet, but good to know. Which variables are which sizes can be a bit of a crapshoot. 16:06:48 <04d​racoomega> There are definitely shorts marshalled as ints in places, also. The save code is sometimes fairly ad hoc, and has been added in tiny bits and pieces over many, many years 16:07:27 <06d​olorous_84348> I figured. 16:08:25 <06d​olorous_84348> I suppose since halo and umbra radiuses are limited to the screen, they should be bytes instead of ints all over the code, but... that's not a rabbit hole I want to go down. 16:09:08 <04d​racoomega> I can't imagine the memory saving matters either way, tbh 16:09:44 <04d​racoomega> (Arguably, agrid recalculation speed matters slightly more, and ints generally are faster than smaller types) 16:09:52 <04d​racoomega> But I imagine none of this actually matters 16:10:43 <06d​olorous_84348> Indeed. I was tempted to add support for halos and umbras to ghost demons, in case anyone makes holy ghost demons later, but I don't know how much future-proofing would be needed. 16:12:40 <06d​olorous_84348> But I suppose anyone who wants halos for them can model the code after the umbra stuff. 16:22:36 03dolorous02 07* 0.32-a0-428-gd6b1d19087: Consolidate halo/silence aura/umbra checks. 10(2 minutes ago, 1 file, 6+ 4-) 13https://github.com/crawl/crawl/commit/d6b1d1908775 16:24:42 03dolorous02 07https://github.com/crawl/crawl/pull/3579 * 0.32-a0-429-g0224d6b9b3: Let ghost demons have umbras. 10(2 hours ago, 8 files, 34+ 2-) 13https://github.com/crawl/crawl/commit/0224d6b9b361 16:28:48 <02M​onkooky> I can't help but feel like monster movement could be simpler than it is 16:32:23 <06p​leasingfungus> ideally i think we'd be marshalling almost everything as ints, and in a less ad-hoc and ridiculous format 16:32:38 <06p​leasingfungus> to reduce the possibility for errors 16:33:05 <02M​onkooky> I'm currently upset by the existence of mmov 16:35:50 Unstable branch on underhound.eu updated to: 0.32-a0-427-g448f42529f (34) 16:37:50 <06d​olorous_84348> Ideally, yes, but that'd change so much binary compatibility that maybe that would force a move to TAG_MAJOR_VERSION 35? 16:38:34 possibly worse than that. consider switching to json… 16:43:32 03dolorous02 07* 0.32-a0-429-g0bc28be9fb: Let ghost demons have umbras. 10(2 hours ago, 8 files, 34+ 2-) 13https://github.com/crawl/crawl/commit/0bc28be9fb58 17:53:25 <02M​onkooky> THINK I FOUND SOMETHIN 17:53:39 <02M​onkooky> can someone take a look at mon-ench 261 17:54:31 <02M​onkooky> wait hm. Well, I think something in here is what's making monsters ignore attack orders 17:54:57 <02M​onkooky> except it should, never mind all that 17:55:06 <04d​racoomega> That appears to just be what happens when a monster becomes charmed/bribed 17:55:56 that's how I read it as well 17:56:06 <04d​racoomega> (You might want to be looking at mon-behv.cc line 1028?) 17:57:04 <02M​onkooky> ...yes, this is quite possibly it? 17:57:17 <04d​racoomega> That is what causes them to turn their attention at things that attack them 17:57:44 03dolorous02 07* 0.32-a0-430-g80b497e092: Give players with foul shadow night vision. 10(3 minutes ago, 1 file, 1+ 0-) 13https://github.com/crawl/crawl/commit/80b497e092be 17:57:44 <04d​racoomega> (I mean, not just that line. Target is also set later on in that case (see line 1080, eg) 17:58:21 <02M​onkooky> yeah, ok. I was finding the other points where pet_target was getting messed with and trying to trace it to foe changes 17:58:56 <04d​racoomega> Yeah, it's not even a pet_target thing. Allies don't even consider that when responding to being attacked 17:59:09 <02M​onkooky> it honestly seems nearly irrelevant 18:00:44 <02M​onkooky> since foe is only set to pet_target when they lack a foe, or immediately after you shout at them 18:00:53 03DracoOmega02 07* 0.32-a0-431-ge345137cd0: Fix giving the player exactly 1 XP for kills they were uninvolved with 10(10 minutes ago, 1 file, 1+ 1-) 13https://github.com/crawl/crawl/commit/e345137cd039 18:01:49 <04d​racoomega> Well, pet_target is also used to control following and 'do not response to attacks' behaviour 18:02:06 <04d​racoomega> WIth MHITYOU and MHITNOT 18:02:14 now I'm looking at that and wondering why it doesn't use *= 18:02:21 possibly some C++ thing 18:02:25 <02M​onkooky> yeah but that's an absolutely rubbish way to control that 18:02:59 <04d​racoomega> Look, I am not arguing in defense of the current structure, merely saying what it does 18:04:08 <04d​racoomega> I don't know off hand if it matters here, but it can, as concerns rounding 18:04:19 <04d​racoomega> The order of operations is not exactly the same 18:04:38 <04d​racoomega> (And have run afoul before of *= resulting in different numbers than I expected, due to that) 18:05:05 mm, I guess 18:05:57 <04d​racoomega> Like, assume x = 5 x * 5 / 10 = 2 x * (5 / 10) = 0 and x*= (5/10) is the above 18:06:13 <04d​racoomega> I believe so, at least 18:06:20 <06p​leasingfungus> yes, it would be a bug if that used *= 18:07:10 <06p​leasingfungus> was previously experience = (experience * mons->damage_friendly / mons->damage_total + 1) / 2 18:07:27 <06p​leasingfungus> the +1 to round up 18:26:34 yeh, I keep expecting that to be the same. I actually get that right when writing math code, but I don't use C any more… 18:51:21 <02M​onkooky> Does anyone know why mmov is a field of monster 18:51:55 <02M​onkooky> rather than being local to the 'decide where to step' functions 18:57:49 <09g​ammafunk> the idea is mainly this: cpp // XXX: A bit hacky, but stores where we WILL move, if we don't take // another action instead (used for decision-making) if (mons_stores_tracking_data(*mons)) mons->props[MMOV_KEY].get_coord() = mmov; 18:57:57 <09g​ammafunk> if you're specifically referring to the prop 18:58:17 <09g​ammafunk> so it's used for thorn hunter and boulder beetle logic 18:58:29 <06p​leasingfungus> monkooky: i think it’s because that code is ancient and horrendous 18:58:35 <06p​leasingfungus> assuming we’re talking about the actual field 18:58:39 <06p​leasingfungus> and not the prop 18:59:12 <09g​ammafunk> well the "field" isn't a field at all but just a static "global" 18:59:26 <06p​leasingfungus> yeah i was about to say 18:59:47 <09g​ammafunk> but based on "field of monster" I assume monkooky was in fact referring to the prop? 18:59:52 <06p​leasingfungus> it’s much worse than a field of monster 19:00:06 <06p​leasingfungus> i assumed monkooky misread the code tbh 19:00:28 <09g​ammafunk> how??? crawlcode is so straightforward and easy to understand at a glance... 19:01:19 <09g​ammafunk> but yeah, between all that, hopefully it's a little clearer; we have a cache of where a monster would move because a few bits of non-movement logic needs to look at this to decide non-move actions 19:01:38 <09g​ammafunk> which seems to be only thorn hunter and boulder beetles only 19:02:06 <09g​ammafunk> and if you're wondering instead why that static variable mmov is the way it is....good luck 19:03:02 <02M​onkooky> yes 19:04:06 <04d​racoomega> Basically: there's no good reason mmov is the way it is, only ancient legacy 19:04:11 <04d​racoomega> It would be great to be some other way 19:04:13 <09g​ammafunk> yeah I think most places its moved are in fact not even methods of the monster class 19:04:47 <04d​racoomega> I imagine it's only survived this long because changing it is scary 19:05:03 <06p​leasingfungus> i do think there’s a reasonable path to fix it 19:05:30 <06p​leasingfungus> find a function that uses it. change that function to take a reference to mmov as a param 19:05:36 <06p​leasingfungus> repeat 19:05:41 <04d​racoomega> Sure 19:06:09 <04d​racoomega> That would be better (but I think some of the logic that changes it, ignores it, whatever is also kind of a mess, too) 19:06:24 <06p​leasingfungus> one thing at a time. 19:06:31 <09g​ammafunk> maybe a bunch of things could become methods of monster, which makes argument passing hell less of a thing 19:07:04 <09g​ammafunk> but maybe all users of it are fine just getting an arg since they already only take one or two args (i.e. just mons) 19:07:44 <09g​ammafunk> oh, this is an excellent time to bring up something I didn't want to bring up earlier when I was being somewhat wrong about binomial distributions when talking to elliptic 19:08:07 <09g​ammafunk> %git 7ffb0a46ff 19:08:08 <04C​erebot> gammafunk * 0.32-a0-420-g7ffb0a46ff: feat: Rework wizmode artefact and randart stats (35 hours ago, 3 files, 108+ 271-) https://github.com/crawl/crawl/commit/7ffb0a46ff86 19:08:23 <09g​ammafunk> er 19:08:34 <09g​ammafunk> %git b08f7fadb7 19:08:35 <04C​erebot> gammafunk * 0.32-a0-419-gb08f7fadb7: feat: Specifying fixed properties for randarts (4 days ago, 7 files, 184+ 46-) https://github.com/crawl/crawl/commit/b08f7fadb719 19:08:58 <06p​leasingfungus> hm? 19:09:13 <09g​ammafunk> in this commit, in the change to dgn_place_item() 19:09:56 <09g​ammafunk> I pass in a CrawlHashTable to said function, which itself is taken from the props CrawlHashTable of an item spec 19:10:18 <09g​ammafunk> ok slight correct 19:10:28 <09g​ammafunk> the relevant code is in items() itself 19:10:50 <09g​ammafunk> namely I override a key in the props of the final created item 19:11:00 <09g​ammafunk> with the CrawlHashTable I passed into items 19:11:09 <09g​ammafunk> said table having originally been in an item_spec 19:11:40 <09g​ammafunk> my question is: is this safe, or have I created a memory leak (either from the original prop or at the new one) 19:12:21 <09g​ammafunk> looking at the implementation in store.cc, I think it's ok, but the macro that defines get_table() (which is ugh) is a bit hard to read 19:13:04 <09g​ammafunk> I need this table of data from the item spec to be in the actual item's props so I can use it later on in the item randartification code 19:16:17 <09g​ammafunk> now there's a related but different issue where I think PleasingFungus wanted essentially item prop data to be available to items() to handle logic about item sets. As mentioned at dungeon.cc:4784 in _apply_item_props(). My technique used to pass that data to items() could be generalized a bit to pass the full original item spec props instead of that one hash table 19:16:40 <09g​ammafunk> But before doing any of that I want to make sure that copying props in this way is even valid 19:19:18 <09g​ammafunk> looks like it calls the CrawlStoreValue::unset() method when doing something like this, which should delete any original table 19:19:19 <06p​leasingfungus> i did? 19:20:04 <09g​ammafunk> I believe so, since the code is about item sets, also it has a sort of PF style comment disparaging the current approach :gammafHeh: 19:20:24 <09g​ammafunk> but yeah I can find out if that's where it originated from 19:21:33 <09g​ammafunk> %git 4feb4907b2fa21fa0c6 19:21:34 <04C​erebot> PleasingFungus * 0.31-a0-190-g4feb4907b2: Support no_exclude for misc items (8 months ago, 3 files, 44+ 13-) https://github.com/crawl/crawl/commit/4feb4907b2fa 19:21:42 <09g​ammafunk> I know the tiger by its paws... 19:22:58 <09g​ammafunk> (apparently the original quote is "we recognize the lion by his claw") 19:25:36 <09g​ammafunk> anyhow I guess after re-reading this store.cc code I'm reasonably confident that what I'm doing is ok, I was worried about greating a memory leak since this function is called most times an item is created, but even then I guess a leak would only ever happen when fixed props were being used, which wouldn't be often 19:26:31 <09g​ammafunk> otoh if I generalized the approach to fix the issue mentioned in 4feb4907b2fa21fa0c6, there would be more concern about leakage 19:47:01 <04d​racoomega> Y'know, I don't think I realized until tonight that Primal Wave's incredible loudness is centered on the caster's position and not where the wave actually lands 19:47:13 <04d​racoomega> Which is definitely what I assumed 19:50:17 <09g​ammafunk> usually spells just use spell level as the noise at the caster's position and have the main noise component be the effect noise, which happens at the target 19:51:20 <04d​racoomega> Wait, I thought if noise was specified in spl-data.h, that was overriding the normal 'noise equal to level' thing 19:51:55 <04d​racoomega> Maybe I'm completely wrong 19:51:58 <09g​ammafunk> sadly, I think it depends on whether its a zap as well 19:52:13 <09g​ammafunk> the data in spl-data claims its effect noise 19:52:28 <09g​ammafunk> so that presumably wouldn't override caster noise 19:52:42 <13q​wqwqwqwqwqwqw> @pleasingfungus I discovered that when hasted player_speed() is randomized, so it is possible to attempt to wait off -move and have it fail by one aut 19:52:58 <13q​wqwqwqwqwqwqw> thoughts on just decreasing the duration by one aut to deal with this sort of thing? 19:53:00 <09g​ammafunk> yeah I was wrong about zap data, that thankfully has no additional noise info 19:53:52 <09g​ammafunk> yeah @dracoomega cpp string spell_noise_string(spell_type spell, int chop_wiz_display_width) { const int casting_noise = spell_noise(spell); int effect_noise = spell_effect_noise(spell); 19:54:15 <09g​ammafunk> and as you'd expect, spell_effect_noise mostly just gets the spl-data noise 19:54:33 <09g​ammafunk> and spell_noise() just gets the spell level 19:54:59 <09g​ammafunk> if its an explosion there's an override based on explosion radius for the effect noise 19:55:23 <09g​ammafunk> (for reasons???) 19:55:41 <04d​racoomega> Also, I think some of the latter isn't used 19:56:10 <04d​racoomega> Like, spell_effect_noise is special-cased to care about explosion size, but then actual explosions don't look at spell_effect_noise when determining the noise they make 19:56:26 <04d​racoomega> But use a different function (that also looks at explosion radius, but in a different way) 19:56:27 <06p​leasingfungus> elliptic: sounds fine 19:56:41 <09g​ammafunk> extremely fitting for crawlcode 19:57:19 <09g​ammafunk> I assume this is something about how the noise bar was added much later to dcss 19:57:28 <09g​ammafunk> by advil circa 0.22 or something 19:58:13 <04d​racoomega> case SPELL_FULMINANT_PRISM: // Players usually want the full size explosion Said in a function that - if it was actually referred to - would make fulminant prisms generate the noise of full explosions all the time. I think? 19:58:28 <04d​racoomega> But it seems not to be used, regardless 19:58:58 <04d​racoomega> Oh, maybe this is used on the info screen 19:59:04 <04d​racoomega> To suggest how loud the spell is 19:59:08 <06p​leasingfungus> yeah 19:59:15 <06p​leasingfungus> which predates noise bar 19:59:45 <06p​leasingfungus> and hence is the quality we’ve come to expect and love from old crawlcode 20:00:24 <04d​racoomega> Confusing in various ways 20:01:10 <09g​ammafunk> but contrary to what you originaly suggested, doesn't this show that primal's 25 effect noise is actually not at the caster's position? 20:01:19 <09g​ammafunk> but at the location of effect 20:01:31 <09g​ammafunk> 25 is quite loud 20:02:00 <09g​ammafunk> ??how loud 20:02:00 <04C​erebot> how loud[1/1]: Alarm trap/shield of the gong: 40. Singing sword: up to 35. Shatter: 30. Lightning (storm clouds, chain lightning), scroll of noise: 25. Qazlal: piety/10 up to 16. Shout, maximum melee attack: 12. 20:02:00 GONNNNG! 20:02:37 <09g​ammafunk> fireball is only 15 20:04:02 <04d​racoomega> No, you're right. I just misunderstood the meaning of the entry in spl-data.h 20:04:28 <04d​racoomega> (But yes, it's as loud as chain lightning or glaciate) 20:04:39 <06p​leasingfungus> time to move spl-data into yaml…? 20:04:57 <04d​racoomega> I don't know that I think that's helpful here ^^; 20:05:09 <04d​racoomega> I mean, I knew that it was a noise parameter, anyway! It wouldn't have helped here ^^; 20:05:45 <09g​ammafunk> yaml is so early 2020s design, Pkl is the format we need for all crawl data 20:05:49 <06p​leasingfungus> think form-data is probably the most promising one, honestly 20:05:56 <04d​racoomega> I just thought that 'beam destination noise' was handled in the part of bolt code that does it for explosions (and a couple other things!) and not this 20:06:45 <04d​racoomega> Of course, most non-explosive bolts don't actually define effect noise at all 20:07:25 <09g​ammafunk> on the dangers of yamlification: As described here: https://github.com/crawl/sequell/commit/a0e6801f63cc23bd4bf27ba01cf2699828f64e89 20:07:25 <09g​ammafunk> https://cdn.discordapp.com/attachments/747522859361894521/1210060248946311299/image.png?ex=65e92f6d&is=65d6ba6d&hm=4b5097cc6b4f9fe2abb3c66cd7b93e11ddd0b5dfabad2d0a2d08184174957984& 20:07:55 <09g​ammafunk> (entirely due to an older version of the yaml standard but funny/annoying regardless) 20:08:09 <04d​racoomega> Haha, right, that 20:08:39 03elliptic02 07* 0.32-a0-432-g7d46fac7e4: Don't fail to wait off Coglin -Move due to haste randomization 10(7 minutes ago, 1 file, 3+ 2-) 13https://github.com/crawl/crawl/commit/7d46fac7e42d 20:11:09 <06p​leasingfungus> that actually rules 20:40:41 -!- The topic of #crawl-dev is: Crawl Development | https://github.com/crawl/crawl | Logs: http://s-z.org/crawl-dev/, temporarily http://crawl.akrasiac.org/logs/cheibriados/ | People with +v have commit access, devs on bridged discord as well | General Crawl-related chat to #crawl | Long stuff to a pastebin service, please 20:40:41 -!- The topic of #crawl is: Play Dungeon Crawl Stone Soup online now! Type ??online for instructions, ??lg / !lg for play stats | PM Sequell for long queries | http://crawl.develz.org | FooTV game replays: ??footv for instructions | #crawl-dev for dev discussion, #crawl-offtopic for offtopic 21:04:58 Kroxigor (L8 DrCj) Crash caused by signal #6: Aborted (D:6) 21:04:58 Kroxigor (L8 DrCj) Crash caused by signal #6: Aborted (D:6) 21:11:47 03gammafunk02 07[brokenarts] * 0.32-a0-421-g54d564c4bb: feat: Simplify formulas for artefact properties (elliptic) 10(13 hours ago, 1 file, 8+ 6-) 13https://github.com/crawl/crawl/commit/54d564c4bb5b 21:12:07 <09g​ammafunk> @qwqwqwqwqwqwqw looks like p = 0.21 worked fine in both cases, per results shown at end of this commit https://github.com/crawl/crawl/commit/54d564c4bb5ba699795f263443566bdc247aacb8 21:13:51 <09g​ammafunk> hrm 22:08:15 03dolorous02 07* 0.32-a0-433-g08bcfe7efd: Fix "Brilliance" inscription: Halo -> Umbra. 10(2 minutes ago, 1 file, 1+ 1-) 13https://github.com/crawl/crawl/commit/08bcfe7efda4 23:35:24 Unstable branch on crawl.develz.org updated to: 0.32-a0-433-g08bcfe7efd (34) 23:58:10 Windows builds of master branch on crawl.develz.org updated to: 0.32-a0-433-g08bcfe7efd