aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2022-03-08add EoD elite spec IDsDaniel Schadt
This is the one thing that prevents evtclib from parsing new logs, as we can handle unknown bosses, but no unknown elite specs.
2021-11-25bump version to 0.6.1v0.6.1Daniel Schadt
2021-11-22add Twisted CastleDaniel Schadt
There's not many useful things we can do with this log, other than providing a way for downstream applications to identify those logs.
2021-11-19add benchmarks to the packagev0.6.0Daniel Schadt
Cargo will complain if the benchmarks that are defined in Cargo.toml are not found, so we need to include the sources - even if the benchmark itself cannot be run from the cargo package (due to the missing test logs).
2021-11-19Merge branch 'more-benches'Daniel Schadt
2021-11-19bump version to 0.6.0Daniel Schadt
2021-11-19small doc typo fixesDaniel Schadt
2021-11-18update the changelog moreDaniel Schadt
With a new release being on the way (and long overdue), it's time to get the CHANGELOG up to date with what actually happened since v0.5.0.
2021-11-18make EventKind non-exhaustiveDaniel Schadt
There are two reasons for this: First, we want to implement new events (and arcdps might add new events themselves) without having to release a new major version. Adding enum variants is usually a breaking change, because match blocks have to be adjusted to keep every variant included. This is the same reason why we made Encounter and Boss non-exhaustive as well. Secondly, the usual modus operandi is not to iterate through all events and do something for every event kind that you find, but rather to iterate through the events and look for the events that you find interesting. This means that most often, you will use a match with a "do-nothing" catch-all, an if-let or a matches!() anyway, in which case this change does not affect the code in a good or bad way.
2021-11-18update changelogDaniel Schadt
2021-11-18speed up Log::is_bossDaniel Schadt
It is way cheaper to retrieve the correct agent first (especially with the faster agent_by_addr) and then check if it is a boss, rather than iterating over all bosses (which iterates through all characters), and then iterate through the found bosses to check if any address matches. The new code is a bit longer (and doesn't combine the functions as nicely), but it is still readable and more performant - which is more important.
2021-11-18speed up Log::agent_by_addrDaniel Schadt
We know that the way we construct the Log, the agents are always sorted by their address. This invariant cannot be broken, as the only way to construct a Log is in evtclib itself, and there is no way to obtain a mutable view on the agent vector or change the address of an agent. Since Log::agent_by_addr is used by other functions, this speedup (even if it is small) can show in a lot of different places. Note that if we change the interface of Log in the future to allow creating logs from different sources that processing::process, we need to make sure we adjust this function.
2021-11-18switch order of operands in SH analyzerDaniel Schadt
Comparing the int is a very cheap operation, and it is also a very good indicator already that we've found the right event. Due to the short circuiting behaviour of &&, it is better to check that first before doing the Log::is_boss check - which is relatively costly. Remember that we do this check for every buff application event! This brings a speedup of around 50x: new: 654.1±25.18µs old: 34.9±0.69ms
2021-11-18formatting fixDaniel Schadt
2021-11-18clean up parsing benchmarksDaniel Schadt
2021-11-18add html_reports feature to criterionDaniel Schadt
2021-11-18add a Throughput to the analyzer benchmarksDaniel Schadt
2021-11-18add more benchmarks for analyzersDaniel Schadt
2021-11-17derive most traits for Agent and SkillDaniel Schadt
2021-11-17Implement FromStr for GameModeDaniel Schadt
This may be useful for downstream applications and it fits into the pattern of implementing it for Boss/Encounter.
2021-11-17Move game_mode to EncounterDaniel Schadt
If we already have an Encounter, it might be nice to determine the game mode from it as well - without needing to go through the whole log first. This is especially useful for raidgrep, where we can use the early filters - which don't have access to the whole Log item.
2021-11-16Add GameMode and Log::game_modeDaniel Schadt
For a lot of applications, it can be useful to distinguish between logs made in raids, fractals, ... Note that we probably don't want further categorization (as for example done in ezau).
2021-11-16Small documentation fix for EncounterDaniel Schadt
2021-11-16update changelogDaniel Schadt
2021-11-16Add Statues of GrenthDaniel Schadt
2021-11-13Implement the River of Souls encounterDaniel Schadt
2021-11-13add tests for Trio parsingDaniel Schadt
2021-11-13add bandit trio encounter & boss IDsDaniel Schadt
2021-11-13Document panic in Log::boss and remove other panicDaniel Schadt
Overall, evtclib is doing quite well on the .unwrap()/.expect()/panic!() calls, except for some doctests (which can be changed at some point) and the actual tests. One case where we do panic (and should document it!) is Log::boss. The documentation has been added there. Another (rare if not impossible for proper evtc files) case was the conversion of the language event, which assumed that we will definitely be able to convert the u64 to the right language. In all normal cases this should be true, but if evtclib deals with untrusted input, we might not want to panic a whole program because someone smuggled in a malicious file.
2021-11-13Add a "is_generic" to detect WvW logsDaniel Schadt
The wording on the evtc README is > an npcid of 1 indicates log is generic - triggers by squadmember > entering combat and not as a result of a boss species id. It is not quite clear whether "generic" implies WvW or if there are PvE generic logs as well if you manage to set up arcdps in the right way. Therefore, the wording in evtclib is rather unspecific as well.
2021-11-12remove superfluous semicolonsDaniel Schadt
2021-11-12small lint fixesDaniel Schadt
2021-11-12Fix player name parsing logicDaniel Schadt
The old code seemed to choke on WvW players, as the subgroup-calculating code did 0 - b'0', which underflowed. The proper way to parse a subgroup is not to take a single character anyway, because subgroups can be bigger than 10. The new code fixes that by properly extracting the "subgroup str literal" and then parsing it as an integer, with some special logic to detect an "empty" subgroup as it is in WvW.
2021-11-12Add kitty golem encounters from the training areaDaniel Schadt
2020-12-11add CBTR_BREAKBAR enum variantDaniel Schadt
2020-12-11add buff stack id to BuffApplication eventDaniel Schadt
It turns out that arcDPS gives each boon stack an ID which is also re-used in the BuffRemoval or StackReset events.
2020-12-11add StackActive and StackReset eventsDaniel Schadt
As it turns out, the padding bytes are not just padding, but for some events they contain useful information. Therefore, we've adjusted the parser to save those bytes (if available).
2020-12-11add comment about ReplInfoDaniel Schadt
2020-12-11add BuffInitial event handlingDaniel Schadt
2020-12-08add CBTS_BARRIERUPDATE statechangeDaniel Schadt
2020-10-23speed up agent-by-addr searchDaniel Schadt
When this function was written, it was done under the assumption that a) There are not a lot of agents, so linear search is fast enough and b) We just want it to work for now However, it turns out that there can be a lot of agents, close to 1000 for the Qadim log for example. This means that there is quite some time saving that we can do here, as get_agent_by_addr is used a lot in set_agent_awares and set_agent_masters, so speeding this part up is good! We could build a HashMap, mapping the address to the agent (index), but that would mean that we have to carry the hash map around. This patch provides a simpler yet already good improvement: We invest a bit of time after converting all agents to sort them by their address (as the agent order is implementation defined anyway), so we can later use a binary search to get the right agent. It's not O(1), as a hash map would be, but it works in logarithmic time and already provides a big benefit: Before process Qadim time: [39.444 ms 39.501 ms 39.561 ms] After process Qadim time: [18.699 ms 18.744 ms 18.788 ms] change: [-52.672% -52.546% -52.413%] (p = 0.00 < 0.05) That is half of the processing time saved by a 3 line patch!
2020-10-23use iterator methods instead of for loopsDaniel Schadt
No particular reason other than it's more idiomatic and shorter. inline has been added to get_agent_by_addr since it "feels" like a short function that can and should be inlined, but it doesn't matter too much.
2020-10-23add a benchmark for evtclib::processDaniel Schadt
2020-10-23add some basic parsing benchmarksDaniel Schadt
This adds some simple benchmarks to test the speed of evtclib::process_{file,stream}, just so we can quickly assess on a high-level if changes make a big impact. I'd like to add some more benchmarks in the future as well, mostly - on the higher level when we go from RawEvtc to a log, benchmarking the process function itself (thus not benchmarking all the byte-twiddling deserialization code). - on the Analyzer level
2020-10-07bump version to 0.5.0v0.5.0Daniel Schadt
2020-10-04add Encounter::from_header_idDaniel Schadt
It makes sense to expose this logic as a function, as other programs like raidgrep might want to use the same logic when dealing with partial evtc files.
2020-10-01implement sequence deserialization for AgentDaniel Schadt
2020-10-01remove another redundant static qualifierDaniel Schadt
2020-10-01remove redundant static qualifierDaniel Schadt
2020-10-01fix documentation linksDaniel Schadt