minor style fixes

This commit is contained in:
Martin Michelsen
2023-08-10 21:03:58 -07:00
parent c57b031156
commit c7c2d54183
5 changed files with 53 additions and 41 deletions
+3 -3
View File
@@ -30,9 +30,9 @@ RELFileSet::RELFileSet(std::shared_ptr<const std::string> data)
ArmorRandomSet::ArmorRandomSet(std::shared_ptr<const std::string> data)
: RELFileSet(data) {
// For some reason the footer tables are doubly indirect in this file
uint32_t specs_offset_offset = r.pget_u32b(data->size() - 0x10);
uint32_t specs_offset = r.pget_u32b(specs_offset_offset);
this->tables = &r.pget<parray<TableSpec, 3>>(specs_offset);
uint32_t specs_offset_offset = this->r.pget_u32b(data->size() - 0x10);
uint32_t specs_offset = this->r.pget_u32b(specs_offset_offset);
this->tables = &this->r.pget<parray<TableSpec, 3>>(specs_offset);
}
std::pair<const ArmorRandomSet::WeightTableEntry8*, size_t>
+44
View File
@@ -3,9 +3,53 @@
#include <phosg/Encoding.hh>
#include "GSLArchive.hh"
#include "PSOEncryption.hh"
#include "StaticGameData.hh"
#include "Text.hh"
// Note: There are clearly better ways of doing this, but this implementation
// closely follows what the original code in the client does.
template <typename ItemT, size_t MaxCount>
struct ProbabilityTable {
ItemT items[MaxCount];
size_t count;
ProbabilityTable() : count(0) {}
void push(ItemT item) {
if (this->count == MaxCount) {
throw runtime_error("push to full probability table");
}
this->items[this->count++] = item;
}
ItemT pop() {
if (this->count == 0) {
throw runtime_error("pop from empty probability table");
}
return this->items[--this->count];
}
void shuffle(PSOLFGEncryption& random_crypt) {
for (size_t z = 1; z < this->count; z++) {
size_t other_z = random_crypt.next() % (z + 1);
ItemT t = this->items[z];
this->items[z] = this->items[other_z];
this->items[other_z] = t;
}
}
ItemT sample(PSOLFGEncryption& random_crypt) const {
if (this->count == 0) {
throw runtime_error("pop from empty probability table");
} else if (this->count == 1) {
return this->items[0];
} else {
return this->items[random_crypt.next() % this->count];
}
}
};
class CommonItemSet {
public:
template <typename IntT>
+1 -36
View File
@@ -32,9 +32,7 @@ ItemCreator::ItemCreator(
pt(&this->common_item_set->get_table(
this->episode, this->mode, this->difficulty, this->section_id)),
restrictions(restrictions),
random_crypt(random_seed) {
print_data(stderr, this->pt, sizeof(*this->pt));
}
random_crypt(random_seed) {}
bool ItemCreator::are_rare_drops_allowed() const {
// Note: The client has an additional check here, which appears to be a subtle
@@ -852,39 +850,6 @@ IntT ItemCreator::get_rand_from_weighted_tables_2d_vertical(
offset, Y, X);
}
// Note: There are clearly better ways of doing this, but this implementation
// closely follows what the original code in the client does.
template <typename ItemT, size_t MaxCount>
struct ProbabilityTable {
ItemT items[MaxCount];
size_t count;
ProbabilityTable() : count(0) {}
void push(ItemT item) {
if (this->count == MaxCount) {
throw runtime_error("push to full probability table");
}
this->items[this->count++] = item;
}
ItemT pop() {
if (this->count == 0) {
throw runtime_error("pop from empty probability table");
}
return this->items[--this->count];
}
void shuffle(PSOLFGEncryption& random_crypt) {
for (size_t z = 1; z < this->count; z++) {
size_t other_z = random_crypt.next() % (z + 1);
ItemT t = this->items[z];
this->items[z] = this->items[other_z];
this->items[other_z] = t;
}
}
};
vector<ItemData> ItemCreator::generate_armor_shop_contents(size_t player_level) {
vector<ItemData> shop;
this->generate_armor_shop_armors(shop, player_level);
+1 -1
View File
@@ -1646,7 +1646,7 @@ static void on_identify_item_bb(shared_ptr<ServerState>,
size_t x = c->game_data.player()->inventory.find_item(cmd.item_id);
if (c->game_data.player()->inventory.items[x].data.data1[0] != 0) {
return; // only weapons can be identified
return; // Only weapons can be identified
}
c->game_data.player()->disp.stats.meseta -= 100;
+4 -1
View File
@@ -844,19 +844,22 @@ void ServerState::load_item_tables() {
// Note: These files don't exist in BB, so we use the GC versions of them
// instead. This doesn't include Episode 4 of course, so we use Episode 1
// parameters for Episode 4 implicitly.
config_log.info("Loading common item tables");
config_log.info("Loading common item table");
shared_ptr<string> pt_data(new string(load_file(
"system/blueburst/ItemPT_GC.gsl")));
this->common_item_set.reset(new CommonItemSet(pt_data));
config_log.info("Loading armor table");
shared_ptr<string> armor_data(new string(load_file(
"system/blueburst/ArmorRandom_GC.rel")));
this->armor_random_set.reset(new ArmorRandomSet(armor_data));
config_log.info("Loading tool table");
shared_ptr<string> tool_data(new string(load_file(
"system/blueburst/ToolRandom_GC.rel")));
this->tool_random_set.reset(new ToolRandomSet(tool_data));
config_log.info("Loading weapon tables");
const char* filenames[4] = {
"system/blueburst/WeaponRandomNormal_GC.rel",
"system/blueburst/WeaponRandomHard_GC.rel",