Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit 586660e

Browse files
committed
Should work now hopefully
1 parent 8891ca3 commit 586660e

File tree

10 files changed

+107
-46
lines changed

10 files changed

+107
-46
lines changed

src/core/byond_functions.inl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
F(String*, , GetStringTableEntry, int stringId)
1010
F(void, , SetTurfAppearance, int appearance, int turf)
11-
F(void, , SetAppearance, Value atom, int appearance)
11+
F(void, REGPARM3, SetAppearance, Value atom, int appearance)
1212
F(void, , SpliceString, unsigned int id)
1313
F(void, , SetPixelX, Value atom, short pixel_x)
1414
F(void, , SetPixelY, Value atom, short pixel_y)
@@ -29,7 +29,7 @@ F(void, REGPARM2, Output, Value target, Value unk, Value thing)
2929
F(void*, , GetVisContents, Value thing, bool modify)
3030
F(bool, , AddToScreen, Value thing, unsigned short client)
3131
F(void, , RemoveFromScreen, Value thing, unsigned short client)
32-
F(void, , SendMapsClient, unsigned short client)
32+
F(void, REGPARM3, SendMapsClient, unsigned short client)
3333

3434
#ifdef _WIN32
3535
F(void, _fastcall, SpliceAppearance, void* this_, int edx, int appearance) // it's actually __thiscall but c++ compilers are stupid

src/core/byond_structures.h

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,24 @@ struct TableHolder2
4545
unsigned int length;
4646
};
4747

48-
template<class T>
48+
template<class T, class S = unsigned int>
4949
struct RefTable
5050
{
51-
RefTable(T*** e, unsigned int* l) : elements(*e), length(*l) {}
51+
RefTable(T*** e, S* l) : elements(*e), length(*l) {}
5252
RefTable(TableHolder2* th) : elements(*(T***)&th->elements), length(th->length) {}
53-
RefTable(void* base, int elements_offset, int length_offset) : elements(**(T****)((int)base+elements_offset)), length(**(unsigned int**)((int)base + length_offset)) {}
53+
RefTable(void* base, int elements_offset, int length_offset) : elements(**(T****)((int)base+elements_offset)), length(**(S**)((int)base + length_offset)) {}
5454
RefTable() : elements(dummy_elements), length(dummy_length) {}
5555
T**& elements;
56-
unsigned int& length;
57-
T *GetItem(unsigned int id) {
56+
S& length;
57+
T *GetItem(S id) {
5858
if (id < this->length) {
5959
return this->elements[id];
6060
}
6161
return nullptr;
6262
}
6363
private:
6464
T** dummy_elements = nullptr;
65-
unsigned int dummy_length = 0;
65+
S dummy_length = 0;
6666
};
6767

6868
struct TableHolder3
@@ -84,7 +84,11 @@ struct VarListEntry
8484
struct Client {
8585
unsigned char unk_0[0x4];
8686
int address;
87+
#ifdef _WIN32
8788
unsigned char unk_8[0x64];
89+
#else
90+
unsigned char unk_8[0x44];
91+
#endif
8892
int key;
8993
int ckey;
9094
unsigned char unk_74[4];
@@ -187,7 +191,11 @@ struct Mob
187191
int appearance; // 64
188192
int appearance2; // 68
189193
int appearance3; // 6c
194+
#ifdef _WIN32
190195
char unknown5[0x4C]; // 70
196+
#else
197+
char unknown5[0x48];
198+
#endif
191199
void* unknown_list3; // bc
192200
unsigned short client; // c0
193201
unsigned short unknown6;
@@ -233,19 +241,37 @@ struct TurfSharedInfo {
233241
int unk_1c;
234242
};
235243

236-
struct TurfTableHolder {
237-
int* shared_info_id_table;
238-
unsigned char* existence_table;
244+
#ifdef _WIN32
245+
struct WorldSizeHolder {
246+
int turf_count;
247+
unsigned short maxx;
248+
unsigned short gap1;
249+
unsigned short maxy;
250+
unsigned short gap2;
251+
unsigned short maxz;
252+
};
253+
#else
254+
struct WorldSizeHolder {
239255
int turf_count;
240-
int maxx;
241-
int maxy;
242-
int maxz;
256+
int gap;
257+
unsigned short maxx;
258+
unsigned short maxy;
259+
unsigned short maxz;
243260
};
261+
#endif
262+
263+
#ifdef _WIN32
244264
struct TurfHashtableHolder {
245265
Turf** elements;
246266
int size;
247-
int mask;
267+
unsigned short mask;
268+
};
269+
#else
270+
struct TurfHashtableHolder {
271+
unsigned short mask;
272+
Turf** elements;
248273
};
274+
#endif
249275

250276
enum class AppearanceRbtColor : bool
251277
{
@@ -290,6 +316,7 @@ struct Appearance
290316
unsigned long long unk_4a_8 : 2;
291317

292318
unsigned long long appearance_flags : 12;
319+
unsigned long long other_bits : 31;
293320

294321
unsigned char dir; // 50
295322
unsigned char invisibility;
@@ -349,7 +376,9 @@ struct Appearance
349376
int unk_d0;
350377
int unk_d4;
351378
int unk_d8;
379+
#ifdef _WIN32
352380
int unk_dc;
381+
#endif
353382
float *color_matrix; // e0
354383
int refcount; // e4
355384
};

src/core/core.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ std::unique_ptr<RefTable<Datum>> Core::datum_table;
99
//TableHolder2* Core::list_table = nullptr;
1010
std::unique_ptr<RefTable<Mob>> Core::mob_table;
1111
std::unique_ptr<RefTable<ImageOverlay>> Core::image_table;
12-
std::unique_ptr<RefTable<Client>> Core::client_table;
12+
std::unique_ptr<RefTable<Client, unsigned short>> Core::client_table;
1313
TableHolder2* Core::appearance_list_table = nullptr;
1414
AppearanceTable** Core::appearance_table = nullptr;
15-
TurfTableHolder* Core::turf_table = nullptr;
16-
TurfHashtableHolder* Core::turf_hashtable = nullptr;
15+
16+
int** Core::turf_table = nullptr;
17+
Turf*** Core::turf_hashtable = nullptr;
18+
unsigned short* Core::turf_hashtable_mask = nullptr;
19+
unsigned char** Core::turf_existence_table = nullptr;
1720
TurfSharedInfo*** Core::turf_shared_info_table = nullptr;
21+
WorldSizeHolder* Core::world_size = nullptr;
1822

1923
void Core::Alert(const std::string& what) {
2024
#ifdef _WIN32

src/core/core.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ namespace Core {
2323
extern std::unique_ptr<RefTable<Obj>> obj_table;
2424
extern std::unique_ptr<RefTable<Datum>> datum_table;
2525
//extern TableHolder2* list_table; //list list honk
26-
extern std::unique_ptr<RefTable<Client>> client_table;
26+
extern std::unique_ptr<RefTable<Client, unsigned short>> client_table;
2727
extern std::unique_ptr<RefTable<Mob>> mob_table;
2828
extern std::unique_ptr<RefTable<ImageOverlay>> image_table;
2929
extern TableHolder2* appearance_list_table;
3030
extern AppearanceTable** appearance_table;
31-
extern TurfTableHolder* turf_table;
32-
extern TurfHashtableHolder* turf_hashtable;
31+
32+
extern int** turf_table;
33+
extern Turf*** turf_hashtable;
34+
extern unsigned short* turf_hashtable_mask;
35+
extern unsigned char** turf_existence_table;
3336
extern TurfSharedInfo*** turf_shared_info_table;
37+
extern WorldSizeHolder* world_size;
3438
}

src/core/find_functions.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ bool Core::find_functions()
6161
void* del_datum_ptr = Pocket::Sigscan::FindPattern(BYONDCORE, "?? ?? ?? ?? 73 55 A1 ?? ?? ?? ?? 8B 04 88 85 C0 74 49 8B 50 18 81 FA 00 00 00 70");
6262
TRUE_OR_DIE(del_datum_ptr);
6363
datum_table = std::make_unique<RefTable<Datum>>((void*)del_datum_ptr, 7, 0);
64-
client_table = std::make_unique<RefTable<Client>>((void*)AddToScreen, 21, 11);
64+
client_table = std::make_unique<RefTable<Client, unsigned short>>((void*)AddToScreen, 21, 11);
6565
image_table = std::make_unique<RefTable<ImageOverlay>>((void*)GetVisContents, 0x86, 0x7F);
6666
appearance_table = *(AppearanceTable***)Pocket::Sigscan::FindPattern(BYONDCORE, "55 8b ec a1 ?? ?? ?? ?? 8b 4d 08 3b 48 44 73 08 8b 40 40 8b 04 88 5d c3", 4);
6767
void* get_id_list_ptr = Pocket::Sigscan::FindPattern(BYONDCORE, "55 8b ec 83 ec 0c 53 56 57 ff 75 08 e8 ?? ?? ?? ?? 83 c4 04 85 c0", 13);
@@ -70,9 +70,12 @@ bool Core::find_functions()
7070
appearance_list_table = *(TableHolder2**)((int)get_id_list + 19);
7171
char* get_shared_turf_ptr = (char*)Pocket::Sigscan::FindPattern(BYONDCORE, "55 8b ec 8b 4d 08 3b 0d ?? ?? ?? ?? 73 12 a1 ?? ?? ?? ?? 8b 0c 88 a1 ?? ?? ?? ?? 8b 04 88 5d c3 33 c0 5d c3");
7272
TRUE_OR_DIE(get_shared_turf_ptr)
73-
turf_table = *(TurfTableHolder**)(get_shared_turf_ptr + 15);
73+
turf_table = *(int***)(get_shared_turf_ptr + 15);
74+
turf_existence_table = ((int)turf_table + 4);
75+
world_size = (WorldSizeHolder*)((int)turf_table + 8);
7476
turf_shared_info_table = *(TurfSharedInfo****)(get_shared_turf_ptr + 23);
75-
turf_hashtable = *(TurfHashtableHolder**)Pocket::Sigscan::FindPattern(BYONDCORE, "55 8b ec a1 ?? ?? ?? ?? 8b 55 08 23 c2 0f b7 c8 a1 ?? ?? ?? ??", 17);
77+
turf_hashtable = *(Turf****)Pocket::Sigscan::FindPattern(BYONDCORE, "55 8b ec a1 ?? ?? ?? ?? 8b 55 08 23 c2 0f b7 c8 a1 ?? ?? ?? ??", 17);
78+
turf_hashtable_mask = (int)(turf_hashtable + 8);
7679
TRUE_OR_DIE(turf_hashtable);
7780
#else
7881
FIND_OR_DIE(GetStringTableEntry, "55 89 E5 83 EC 18 8B 45 ?? 39 05 ?? ?? ?? ?? 76 ?? 8B 15 ?? ?? ?? ?? 8B 04 ??");
@@ -84,8 +87,8 @@ bool Core::find_functions()
8487
FIND_OR_DIE(SetAppearance, "55 89 e5 83 ec 38 3c 54 89 5d f4 89 cb");
8588
FIND_OR_DIE(SetPixelX, "55 89 e5 57 56 53 81 ec 4c 01 00 00 8b 75 08 8b 5d 0c 0f b7 7d 10");
8689
FIND_OR_DIE(SetPixelY, "55 89 e5 57 56 53 81 ec 6c 01 00 00 8b 75 08 8b 5d 0c 0f b7 7d 10");
87-
FIND_OR_DIE(SetPixelW, "55 89 e5 81 ec 38 01 00 00 89 7d fc 8b 7d 08 89 5d f4 0f b7 5d 10 89 75 f8 8b 75 0c 89 f8 3c 03 0f 84 d2 01 00 00 3c 02 0f 84 f2 00 00 00 89 3c 24 89 74 24 04 e8 ?? ?? ?? ?? 8b 15 d8 a9 67 00 89 85 f0 fe ff ff 8b 8d f0 fe ff ff 31 c0 3b 4a 44 0f 82 b9 01 00 00 8d 8d 04 ff ff ff 89 44 24 04 89 0c 24 e8 ?? ?? ?? ?? 89 d8 66 2b 85 5c ff ff ff");
88-
FIND_OR_DIE(SetPixelZ, "55 89 e5 81 ec 38 01 00 00 89 7d fc 8b 7d 08 89 5d f4 0f b7 5d 10 89 75 f8 8b 75 0c 89 f8 3c 03 0f 84 d2 01 00 00 3c 02 0f 84 f2 00 00 00 89 3c 24 89 74 24 04 e8 ?? ?? ?? ?? 8b 15 d8 a9 67 00 89 85 f0 fe ff ff 8b 8d f0 fe ff ff 31 c0 3b 4a 44 0f 82 b9 01 00 00 8d 8d 04 ff ff ff 89 44 24 04 89 0c 24 e8 ?? ?? ?? ?? 89 d8 66 2b 85 5e ff ff ff");
90+
FIND_OR_DIE(SetPixelW, "55 89 e5 81 ec 38 01 00 00 89 7d fc 8b 7d 08 89 5d f4 0f b7 5d 10 89 75 f8 8b 75 0c 89 f8 3c 03 0f 84 d2 01 00 00 3c 02 0f 84 f2 00 00 00 89 3c 24 89 74 24 04 e8 ?? ?? ?? ?? 8b 15 ?? ?? ?? ?? 89 85 f0 fe ff ff 8b 8d f0 fe ff ff 31 c0 3b 4a 44 0f 82 b9 01 00 00 8d 8d 04 ff ff ff 89 44 24 04 89 0c 24 e8 ?? ?? ?? ?? 89 d8 66 2b 85 5c ff ff ff");
91+
FIND_OR_DIE(SetPixelZ, "55 89 e5 81 ec 38 01 00 00 89 7d fc 8b 7d 08 89 5d f4 0f b7 5d 10 89 75 f8 8b 75 0c 89 f8 3c 03 0f 84 d2 01 00 00 3c 02 0f 84 f2 00 00 00 89 3c 24 89 74 24 04 e8 ?? ?? ?? ?? 8b 15 ?? ?? ?? ?? 89 85 f0 fe ff ff 8b 8d f0 fe ff ff 31 c0 3b 4a 44 0f 82 b9 01 00 00 8d 8d 04 ff ff ff 89 44 24 04 89 0c 24 e8 ?? ?? ?? ?? 89 d8 66 2b 85 5e ff ff ff");
8992
FIND_OR_DIE(SetMovableDir, "55 89 e5 81 ec 38 01 00 00 8b 45 08 89 75 f8 0f b6 55 10 89 7d fc 8b 7d 0c 89 5d f4 3c 03 89 c6 89 85 f4 fe ff ff");
9093
FIND_OR_DIE(SetLoc, "55 89 e5 83 ec 38 89 5d f4 8b 45 0c 89 75 f8 8b 5d 10 8b 75 14 89 7d fc 0f b6 7d 08 89 45 e4 89 1c 24 89 74 24 04");
9194
FIND_OR_DIE(SpliceAppearance, "55 89 e5 83 ec 18 89 5d f8 8b 5d 08 89 75 fc 8b 75 0c 8b 4b 38 89 f0 d3 e8 3b 43 28 89 c1");
@@ -94,7 +97,7 @@ bool Core::find_functions()
9497
FIND_OR_DIE(Output, "55 89 e5 81 ec 98 01 00 00 89 5d f4 89 c3 8b 45 0c 80 fb 23 8b 4d 08 89 75 f8 8b 75 10 89 7d fc 8b 7d 14 89 95 94 fe ff ff 89 85 a4 fe ff ff");
9598
FIND_OR_DIE(GetVisContents, "55 89 e5 83 ec 08 8b 55 08 8b 45 0c 0f b6 4d 10 80 fa 54 76 0b 31 c0 c9 c3");
9699
FIND_OR_DIE(AddToScreen, "55 89 e5 83 ec 48 89 75 f8 0f b7 45 10 8b 75 08 66 3b 05 ?? ?? ?? ?? 89 7d fc 8b 7d 0c 89 5d f4 89 f2");
97-
FIND_OR_DIE(RemoveFromScreen, "55 89 e5 53 83 ec 14 0f b7 45 10 66 3b 05 38 a9 67 00");
100+
FIND_OR_DIE(RemoveFromScreen, "55 89 e5 53 83 ec 14 0f b7 45 10 66 3b 05 ?? ?? ?? ??");
98101
FIND_OR_DIE(DelFilter, "55 89 e5 83 ec 18 89 5d f8 8b 5d 08 89 75 fc 8b 75 0c 8b 4b 6c 89 f0 d3 e8 3b 43 5c 89 c1");
99102
FIND_OR_DIE(SendMapsClient, "55 0f b7 c0 89 e5 57 56 53 81 ec ?? ?? ?? ?? 89 04 24 89 85 ?? ?? ?? ?? e8 ?? ?? ?? ?? 85 c0 89 45 84 0f");
100103
FIND_OR_DIE(CreateObj, "55 89 e5 57 56 53 83 ec 4c a1 ?? ?? ?? ?? 8b 7d 10 85 c0 0f 84 ?? ?? ?? ??");
@@ -104,7 +107,7 @@ bool Core::find_functions()
104107
void* datum_table_ptr = Pocket::Sigscan::FindPattern(BYONDCORE, "55 89 E5 53 83 EC 44 8B 45 08 3B 05 ?? ?? ?? ?? 73 2C 8B 15 ?? ?? ?? ?? 8B 0C 82 85 C9 74 1F 8B 51 ??");
105108
TRUE_OR_DIE(datum_table_ptr);
106109
datum_table = std::make_unique<RefTable<Datum>>(datum_table_ptr, 20, 12);
107-
client_table = std::make_unique<RefTable<Client>>((void*)AddToScreen, 0x26, 0x13);
110+
client_table = std::make_unique<RefTable<Client, unsigned short>>((void*)AddToScreen, 0x26, 0x13);
108111
obj_table = std::make_unique<RefTable<Obj>>((void*)GetVisContents, 0x7a, 0x72);
109112
mob_table = std::make_unique<RefTable<Mob>>((void*)GetVisContents, 0x5a, 0x52);
110113
image_table = std::make_unique<RefTable<ImageOverlay>>((void*)GetVisContents, 0x3a, 0x32);
@@ -115,14 +118,19 @@ bool Core::find_functions()
115118
TRUE_OR_DIE(appearance_list_ptr);
116119
appearance_list_table = *(TableHolder2**)appearance_list_ptr;
117120

118-
turf_table = *(TurfTableHolder**)((int)ChangeTurf + 0x32);
119-
turf_shared_info_table = *(TurfSharedInfo****)((int)ChangeTurf + 0x2a);
120-
turf_hashtable = *(TurfHashtableHolder**)((int)GetVisContents + 0xb9);
121+
turf_table = *(int***)((int)ChangeTurf + 0x2a);
122+
world_size = *(WorldSizeHolder**)((int)ChangeTurf + 0x22);
123+
turf_shared_info_table = *(TurfSharedInfo****)((int)ChangeTurf + 0x32);
124+
turf_hashtable = *(Turf****)((int)GetVisContents + 0xb9);
125+
turf_hashtable_mask = *(unsigned short**)((int)GetVisContents + 0xb3);
126+
turf_existence_table = *(unsigned char***)((int)GetVisContents + 0xa2);
121127

122128
// i love inlining i love inlining
123-
animate_start_call = (unsigned int*)Pocket::Sigscan::FindPattern(BYONDCORE, "e8 ?? ?? ?? ?? 8b b5 ?? ?? ?? ?? 8b bd ?? ?? ?? ?? 89 34 24 89 7c 24 04 e8 ?? ?? ?? ?? 89 c7 31 f6 8d 85 ?? ?? ?? ??", 1);
129+
animate_start_call = (unsigned int*)Pocket::Sigscan::FindPattern(BYONDCORE, "e8 ?? ?? ?? ?? 8b b5 ?? ?? ?? ?? 8b bd ?? ?? ?? ?? 89 34 24 89 7c 24 04 e8 ?? ?? ?? ?? 89 c7 31 f6 8d 85 ?? ?? ?? ??", 1);
130+
TRUE_OR_DIE(animate_start_call);
124131
AnimateStartFun = (AnimateStartFunPtr)RELATIVE_CALL_RESOLVE(animate_start_call);
125-
animate_end_jump = (unsigned int*)Pocket::Sigscan::FindPattern(BYONDCORE, "89 7c 24 04 e8 ?? ?? ?? ?? a1 ?? ?? ?? ?? 8b 0d ?? ?? ?? ?? 8b 1d ?? ?? ?? ?? 0f b7 50 42 8b 78 3c 0f b7 f2 83 c2 01 89 0c f7 89 5c f7 04 66 89 50 42 a1 ?? ?? ?? ?? 0f b7 50 42 8b 40 3c 8d 54 d0 f8 8b 02 8b 52 04 89 04 24 89 54 24 04 e8 ?? ?? ?? ?? 8b 3d ?? ?? ?? ?? e9 ?? ?? ?? ?? ", 90);
132+
animate_end_jump = (unsigned int*)Pocket::Sigscan::FindPattern(BYONDCORE, "89 7c 24 04 e8 ?? ?? ?? ?? a1 ?? ?? ?? ?? 8b 0d ?? ?? ?? ?? 8b 1d ?? ?? ?? ?? 0f b7 50 42 8b 78 3c 0f b7 f2 83 c2 01 89 0c f7 89 5c f7 04 66 89 50 42 a1 ?? ?? ?? ?? 0f b7 50 42 8b 40 3c 8d 54 d0 f8 8b 02 8b 52 04 89 04 24 89 54 24 04 e8 ?? ?? ?? ?? 8b 3d ?? ?? ?? ?? e9 ?? ?? ?? ??", 90);
133+
TRUE_OR_DIE(animate_end_jump);
126134
original_animate_end_jump = (unsigned int)RELATIVE_CALL_RESOLVE(animate_end_jump);
127135

128136
#endif

src/core/subhook/subhook_x86.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ static int subhook_disasm(void *src, int *reloc_op_offset) {
212212
uint8_t opcode = 0;
213213
int found_opcode = false;
214214

215+
if(code[0] == 0x0f && code[1] == 0xb7 && code[2] == 0xc0) return 3;
216+
215217
for (i = 0; i < sizeof(prefixes) / sizeof(*prefixes); i++) {
216218
if (code[len] == prefixes[i]) {
217219
len++;

src/demo_writer/demo_writer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ HOOK_DEF(void, SetLoc)(Value atom, Value loc) {
6464
oSetLoc(atom, loc);
6565
}
6666

67-
HOOK_DEF(void, SetAppearance)(Value atom, int appearance) {
67+
HOOK_DEF(void REGPARM3, SetAppearance)(Value atom, int appearance) {
6868
oSetAppearance(atom, appearance);
6969
mark_atom_dirty(atom);
7070
}
@@ -123,7 +123,7 @@ HOOK_DEF(void, RemoveFromScreen)(Value thing, unsigned short client) {
123123
update_client_screen(client);
124124
oRemoveFromScreen(thing, client);
125125
}
126-
HOOK_DEF(void, SendMapsClient)(unsigned short client) {
126+
HOOK_DEF(void REGPARM3, SendMapsClient)(unsigned short client) {
127127
Client *clientobj = Core::client_table->GetItem(client);
128128
if (clientobj && clientobj->update_flags & 8) {
129129
update_client_screen(client);

src/demo_writer/write_animate.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,23 @@ void pre_animate_hook(void *some_struct, Value args) {
8080
DecRefCount(animate_args);
8181
animate_args = args;
8282
IncRefCount(animate_args);
83-
DecRefCount(last_animate_appearance);
84-
last_animate_appearance = GetVariable(last_animate_obj, 0x106);
85-
IncRefCount(last_animate_appearance);
83+
84+
Value len_value = GetVariable(animate_args, 0x39);
85+
int len = len_value.valuef;
86+
Value firstArg = { NULL_D, {0} };
87+
if (len) firstArg = Core::DecReturn(GetAssocElement(animate_args, ValueFloat(1.0f)));
88+
Value animate_obj;
89+
if (firstArg.type == MOB || firstArg.type == OBJ || firstArg.type == TURF || firstArg.type == IMAGE) {
90+
animate_obj = firstArg;
91+
} else {
92+
animate_obj = last_animate_obj;
93+
}
94+
95+
if(animate_obj.type) {
96+
DecRefCount(last_animate_appearance);
97+
last_animate_appearance = GetVariable(animate_obj, 0x106);
98+
IncRefCount(last_animate_appearance);
99+
}
86100
AnimateStartFun(some_struct, args);
87101
}
88102
#endif

src/demo_writer/write_objects.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ class AtomUpdateBuffer {
286286

287287
template<>
288288
inline int AtomUpdateBuffer<Turf, 0x2, false, false, false>::get_table_length() {
289-
return Core::turf_table->turf_count;
289+
return Core::world_size->turf_count;
290290
}
291291
template<>
292292
inline int AtomUpdateBuffer<Obj, 0x3, true, true, false>::get_table_length() {
@@ -302,10 +302,10 @@ inline int AtomUpdateBuffer<ImageOverlay, 0x5, true, false, false>::get_table_le
302302
}
303303
template<>
304304
inline Turf *AtomUpdateBuffer<Turf, 0x2, false, false, false>::get_element(int id) {
305-
if (id < Core::turf_table->turf_count || Core::turf_table->existence_table[id] == 0) {
305+
if (id >= Core::world_size->turf_count || (*Core::turf_existence_table)[id] == 0) {
306306
return nullptr;
307307
}
308-
Turf* ref = Core::turf_hashtable->elements[id & Core::turf_hashtable->mask];
308+
Turf* ref = (*Core::turf_hashtable)[id & *Core::turf_hashtable_mask];
309309
while (ref && ref->id != id) {
310310
ref = ref->next;
311311
}
@@ -325,8 +325,8 @@ inline ImageOverlay* AtomUpdateBuffer<ImageOverlay, 0x5, true, false, false>::ge
325325
}
326326
template<>
327327
inline int AtomUpdateBuffer<Turf, 0x2, false, false, false>::get_appearance(Turf* turf, int id) {
328-
if (id >= Core::turf_table->turf_count) return 0xFFFF;
329-
int shared_id = Core::turf_table->shared_info_id_table[id];
328+
if (id >= Core::world_size->turf_count) return 0xFFFF;
329+
int shared_id = (*Core::turf_table)[id];
330330
return (*Core::turf_shared_info_table)[shared_id]->appearance;
331331
}
332332
template<>

src/demo_writer/write_primitive.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ void write_world_size() {
133133
struct {
134134
char chunk_id = 1;
135135
char chunk_length = 0x6;
136-
short maxx = Core::turf_table->maxx;
137-
short maxy = Core::turf_table->maxy;
138-
short maxz = Core::turf_table->maxz;
136+
short maxx = Core::world_size->maxx;
137+
short maxy = Core::world_size->maxy;
138+
short maxz = Core::world_size->maxz;
139139
} data;
140140
demo_file_handle.write((char*)&data, sizeof(data));
141141
}

0 commit comments

Comments
 (0)