Fixed inconsistent return value of get_npc_level.

Some edits to documents.
This commit is contained in:
NovaRain
2019-02-25 12:32:56 +08:00
parent 72e370117e
commit 2ce1c0f36e
7 changed files with 44 additions and 36 deletions
+2 -1
View File
@@ -103,6 +103,7 @@
#define RMOBJ_RM_MULT_OBJS 4563866
#define RMOBJ_REPLACE_WEAPON 4658526
#define RMOBJ_THROW 4266040
#define RMOBJ_SUB_CONTAINER 4683191 // search and remove the item from a container inside of an inventory
// offsets for get_proto_data
#define PROTO_PID (1)
@@ -274,7 +275,7 @@
#define OBJ_DATA_FID (0x20)
#define OBJ_DATA_ELEVATION (0x28)
#define OBJ_DATA_PID (0x64)
#define OBJ_DATA_CID (0x68)
#define OBJ_DATA_CID (0x68) // combat id, used for savegame
#define OBJ_DATA_SID (0x78)
// items
#define OBJ_DATA_CUR_CHARGES (0x3C)
+4 -4
View File
@@ -242,12 +242,12 @@ int ret1 - overrides hard-coded handler and selects what should happen with
HOOK_REMOVEINVENOBJ (hs_removeinvenobj.int)
Runs when an object is removed from a critters inventory for any reason
Runs when an object is removed from a container or critter's inventory for any reason
critter arg1 - the critter the object is being removed from
Obj arg1 - the owner that the object is being removed from
item arg2 - the item that is being removed
int arg3 - a flag, or possibly the number of items to remove
int arg4 - The reason the object is being removed. (Actually, the site from which _item_remove_mult was called)
int arg3 - the number of items to remove
int arg4 - The reason the object is being removed (see RMOBJ_* constants)
-------------------------------------------
+5 -4
View File
@@ -100,11 +100,12 @@ array - array ID to be used with array-related functions (actually an integer)
> int game_loaded()
- returns 1 the first time it is called after a new game or game load, and 0 any time after. It works on an individual basis for each script, so one script wont interfere with others. Its primary use is for global scripts, so that they know when to call set_global_script_repeat, but it can be called from normal scripts too.
> void inc_npc_level(string npc)
- takes an NPC name as an argument. The NPC must be in your party. This function ignores player level requirements and the minimum 3 player level delay between NPC level gains. It also ignores the random element, regardless of sfall's NPCAutoLevel setting.
> void inc_npc_level(int pid/string name)
- takes a party member PID or an NPC name (deprecated, for compatibility with sfall 4.1.5/3.8.15 or earlier) as an argument. The NPC must be in your party.
- This function ignores player level requirements and the minimum 3 player level delay between NPC level gains. It also ignores the random element, regardless of sfall's NPCAutoLevel setting.
> int get_npc_level(string npc)
- also takes the NPC name as an argument, and returns the NPC's current level. Again, the NPC needs to be in your party.
> int get_npc_level(int pid/string name)
- also takes the party member PID or NPC name (deprecated, for compatibility with sfall 4.1.5/3.8.15 or earlier) as an argument, and returns the NPC's current level. Again, the NPC needs to be in your party.
> void set_car_current_town(int town)
- changes the current town index for the player's car
+2 -2
View File
@@ -162,8 +162,8 @@
0x81a3 - int eax_available()
0x81a4 - void set_eax_environment(int environment)
0x81a5 - void inc_npc_level(string npcName/int pid)
0x8241 - int get_npc_level(string npcName/int pid)
0x81a5 - void inc_npc_level(int pid/string name)
0x8241 - int get_npc_level(int pid/string name)
0x81a6 - int get_viewport_x()
0x81a7 - int get_viewport_y()
+3 -3
View File
@@ -143,10 +143,10 @@ DWORD* ptr_optionsButtonUpKey = reinterpret_cast<DWORD*>(_optionsButtonU
DWORD* ptr_outlined_object = reinterpret_cast<DWORD*>(_outlined_object);
DWORD* ptr_partyMemberAIOptions = reinterpret_cast<DWORD*>(_partyMemberAIOptions);
DWORD* ptr_partyMemberCount = reinterpret_cast<DWORD*>(_partyMemberCount);
DWORD* ptr_partyMemberLevelUpInfoList = reinterpret_cast<DWORD*>(_partyMemberLevelUpInfoList);
DWORD* ptr_partyMemberList = reinterpret_cast<DWORD*>(_partyMemberList); // each struct - 4 integers, first integer - objPtr
DWORD** ptr_partyMemberLevelUpInfoList = reinterpret_cast<DWORD**>(_partyMemberLevelUpInfoList);
DWORD** ptr_partyMemberList = reinterpret_cast<DWORD**>(_partyMemberList); // each struct - 4 integers, first integer - objPtr
DWORD* ptr_partyMemberMaxCount = reinterpret_cast<DWORD*>(_partyMemberMaxCount);
DWORD* ptr_partyMemberPidList = reinterpret_cast<DWORD*>(_partyMemberPidList);
DWORD** ptr_partyMemberPidList = reinterpret_cast<DWORD**>(_partyMemberPidList);
DWORD* ptr_patches = reinterpret_cast<DWORD*>(_patches);
DWORD* ptr_paths = reinterpret_cast<DWORD*>(_paths);
DWORD* ptr_pc_crit_succ_eff = reinterpret_cast<DWORD*>(_pc_crit_succ_eff);
+3 -3
View File
@@ -367,10 +367,10 @@ extern DWORD* ptr_optionsButtonUpKey;
extern DWORD* ptr_outlined_object;
extern DWORD* ptr_partyMemberAIOptions;
extern DWORD* ptr_partyMemberCount;
extern DWORD* ptr_partyMemberLevelUpInfoList;
extern DWORD* ptr_partyMemberList; // each struct - 4 integers, first integer - objPtr
extern DWORD** ptr_partyMemberLevelUpInfoList;
extern DWORD** ptr_partyMemberList; // each struct - 4 integers, first integer - objPtr
extern DWORD* ptr_partyMemberMaxCount;
extern DWORD* ptr_partyMemberPidList;
extern DWORD** ptr_partyMemberPidList;
extern DWORD* ptr_patches;
extern DWORD* ptr_paths;
extern DWORD* ptr_pc_crit_succ_eff;
+25 -19
View File
@@ -508,13 +508,11 @@ static void __declspec(naked) GetActiveHand() {
retn;
}
}
static void __declspec(naked) ToggleActiveHand() {
__asm {
push ebx;
mov eax, 1;
mov ebx, intface_toggle_items_;
call ebx;
pop ebx;
call intface_toggle_items_;
retn;
}
}
@@ -601,12 +599,14 @@ static void __declspec(naked) IncNPCLevel() {
static void _stdcall get_npc_level2() {
int level = -1;
DWORD pid = opHandler.arg(0).asInt(); // set to 0 if passing npc name
if (!pid) {
const char *critterName, *name = opHandler.arg(0).strValue();
if (name[0] != 0) {
DWORD* members = *(DWORD**)_partyMemberList;
for (DWORD i = 0; i < *(DWORD*)_partyMemberCount; i++) {
DWORD findPid = opHandler.arg(0).asInt(); // set to 0 if passing npc name
const char *critterName, *name = opHandler.arg(0).asString();
if (findPid || name[0] != 0) {
DWORD pid = 0;
DWORD* members = *ptr_partyMemberList;
for (DWORD i = 0; i < *ptr_partyMemberCount; i++) {
if (!findPid) {
__asm {
mov eax, members;
mov eax, [eax];
@@ -617,17 +617,23 @@ static void _stdcall get_npc_level2() {
pid = ((TGameObj*)*members)->pid;
break;
}
members += 4;
} else {
DWORD _pid = ((TGameObj*)*members)->pid;
if (findPid == _pid) {
pid = _pid;
break;
}
}
members += 4;
}
}
if (pid) {
DWORD* pids = *(DWORD**)_partyMemberPidList;
DWORD* lvlUpInfo = *(DWORD**)_partyMemberLevelUpInfoList;
for (DWORD j = 0; j < *(DWORD*)_partyMemberMaxCount; j++) {
if (pids[j] == pid) {
level = lvlUpInfo[j * 3];
break;
if (pid) {
DWORD* pids = *ptr_partyMemberPidList;
DWORD* lvlUpInfo = *ptr_partyMemberLevelUpInfoList;
for (DWORD j = 0; j < *ptr_partyMemberMaxCount; j++) {
if (pids[j] == pid) {
level = lvlUpInfo[j * 3];
break;
}
}
}
}