mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
d5951c2b11
Normally, when they allocate a VagCmd, they do a bunch of stuff to clear all the status bits and reset things in particular the InitVAGCmd function does a lot ![image](https://github.com/open-goal/jak-project/assets/48171810/9b355020-ad37-496c-9438-2f8d34f24e0a) but for the stereo command, they do a lot less: ![image](https://github.com/open-goal/jak-project/assets/48171810/12a36712-0e68-4377-a6be-3bde82c2aa15) Which means that the new_stereo_command can just have random status bits left over from whatever the last user had. we seem to end up in a state where byte21 is set, and this causes everything else to be wrong and off-by-one dma transfer. My guess is that the original game avoided this bug due to lucky timing that I don't understand. I think the fix of just clearing byte21 is ok because there's no way that the old value of the byte is useful after the command is repurposed.
33 lines
864 B
C++
33 lines
864 B
C++
#pragma once
|
|
|
|
#include <optional>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include "Object.h"
|
|
|
|
namespace goos {
|
|
bool get_va(const goos::Object& rest, std::string* err_string, goos::Arguments* result);
|
|
void get_va_no_named(const goos::Object& rest, goos::Arguments* result);
|
|
bool va_check(
|
|
const goos::Arguments& args,
|
|
const std::vector<std::optional<goos::ObjectType>>& unnamed,
|
|
const std::unordered_map<std::string, std::pair<bool, std::optional<goos::ObjectType>>>& named,
|
|
std::string* err_string);
|
|
|
|
template <typename T>
|
|
void for_each_in_list(const goos::Object& list, T f) {
|
|
const goos::Object* iter = &list;
|
|
while (iter->is_pair()) {
|
|
const auto& lap = iter->as_pair();
|
|
f(lap->car);
|
|
iter = &lap->cdr;
|
|
}
|
|
|
|
ASSERT(iter->is_empty_list());
|
|
}
|
|
|
|
int list_length(const goos::Object& list);
|
|
} // namespace goos
|