mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
get_tile_fid correct for backwards compatibility and flexibility
- Allow to pass elevation using the free bits of the tileNum value to access elevations 1 and 2 (instead of defaulting to dude_elevation, which is not how it worked before) - Access roof FID and raw data using mode flags in the top 4 bits
This commit is contained in:
@@ -823,7 +823,11 @@
|
|||||||
- name: Tiles and paths
|
- name: Tiles and paths
|
||||||
items:
|
items:
|
||||||
- name: get_tile_fid
|
- name: get_tile_fid
|
||||||
detail: int get_tile_fid(int tile)
|
detail: int get_tile_fid(int tileData)
|
||||||
|
doc: |
|
||||||
|
- returns FID information about the square under the given tile at elevation 0
|
||||||
|
- pass elevation as 4-bit number in bits 25-28 to access other elevations
|
||||||
|
- pass result mode in bits 29-32: 0 - Ground FID, 1 - Roof FID, 2 - Raw data.
|
||||||
opcode: 0x823a
|
opcode: 0x823a
|
||||||
- name: tile_under_cursor
|
- name: tile_under_cursor
|
||||||
detail: int tile_under_cursor
|
detail: int tile_under_cursor
|
||||||
@@ -850,6 +854,14 @@
|
|||||||
- returns the tile number at the x, y position relative to the top-left corner of the screen
|
- returns the tile number at the x, y position relative to the top-left corner of the screen
|
||||||
- if the position is outside of the range of tiles, it will return -1
|
- if the position is outside of the range of tiles, it will return -1
|
||||||
macro: sfall.h
|
macro: sfall.h
|
||||||
|
- name: get_tile_ground_fid
|
||||||
|
detail: int get_tile_ground_fid(int tileNum, int elevation)
|
||||||
|
doc: Returns FID of a ground tile at given tileNum and elevation.
|
||||||
|
macro: sfall.h
|
||||||
|
- name: get_tile_roof_fid
|
||||||
|
detail: int get_tile_roof_fid(int tileNum, int elevation)
|
||||||
|
doc: Returns FID of a roof tile at given tileNum and elevation. Note that FID of 1 is used when there is no actual roof.
|
||||||
|
macro: sfall.h
|
||||||
|
|
||||||
- name: obj_blocking_line
|
- name: obj_blocking_line
|
||||||
detail: ObjectPtr obj_blocking_line(ObjectPtr objFrom, int tileTo, int blockingType)
|
detail: ObjectPtr obj_blocking_line(ObjectPtr objFrom, int tileTo, int blockingType)
|
||||||
|
|||||||
@@ -321,6 +321,9 @@
|
|||||||
#define get_npc_stat_max(stat) sfall_func2("get_stat_max", stat, 1)
|
#define get_npc_stat_max(stat) sfall_func2("get_stat_max", stat, 1)
|
||||||
#define get_npc_stat_min(stat) sfall_func2("get_stat_min", stat, 1)
|
#define get_npc_stat_min(stat) sfall_func2("get_stat_min", stat, 1)
|
||||||
#define get_sfall_arg_at(argNum) sfall_func1("get_sfall_arg_at", argNum)
|
#define get_sfall_arg_at(argNum) sfall_func1("get_sfall_arg_at", argNum)
|
||||||
|
#define get_tile_fid_ext(tile, elev, mode) get_tile_fid(((mode bwand 0xF) * 0x10000000) bwor ((elev bwand 0xF) * 0x1000000) bwor (tile bwand 0xFFFFFF))
|
||||||
|
#define get_tile_ground_fid(tile, elev) get_tile_fid_ext(tile, elev, 0)
|
||||||
|
#define get_tile_roof_fid(tile, elev) get_tile_fid_ext(tile, elev, 1)
|
||||||
#define get_terrain_name(x, y) sfall_func2("get_terrain_name", x, y)
|
#define get_terrain_name(x, y) sfall_func2("get_terrain_name", x, y)
|
||||||
#define get_text_width(text) sfall_func1("get_text_width", text)
|
#define get_text_width(text) sfall_func1("get_text_width", text)
|
||||||
#define has_fake_perk_npc(npc, perk) sfall_func2("has_fake_perk_npc", npc, perk)
|
#define has_fake_perk_npc(npc, perk) sfall_func2("has_fake_perk_npc", npc, perk)
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ VAR_(sneak_working, DWORD) // DWORD var
|
|||||||
VAR_(sound_music_path1, char*)
|
VAR_(sound_music_path1, char*)
|
||||||
VAR_(sound_music_path2, char*)
|
VAR_(sound_music_path2, char*)
|
||||||
VAR_(speech_volume, DWORD)
|
VAR_(speech_volume, DWORD)
|
||||||
VARA(square, DWORD*, 3)
|
VARA(square, DWORD*, 3) // use (square && 0xFFF) to get ground fid, and ((square >> 16) && 0xFFF) to get roof
|
||||||
VAR_(square_rect, fo::SquareRect) // _square_y
|
VAR_(square_rect, fo::SquareRect) // _square_y
|
||||||
VAR_(squares, DWORD*)
|
VAR_(squares, DWORD*)
|
||||||
VARA(stack, DWORD, 10)
|
VARA(stack, DWORD, 10)
|
||||||
|
|||||||
@@ -332,13 +332,25 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void op_get_tile_fid(OpcodeContext& ctx) {
|
void op_get_tile_fid(OpcodeContext& ctx) {
|
||||||
long tileX, tileY, squareNum,
|
long tileX, tileY, squareNum, squareData, result,
|
||||||
elevation = fo::var::obj_dude->elevation,
|
tileAndElev = ctx.arg(0).rawValue(),
|
||||||
tileNum = ctx.arg(0).rawValue();
|
tileNum = tileAndElev & 0xFFFFFF,
|
||||||
|
elevation = (tileAndElev >> 24) & 0x0F,
|
||||||
|
mode = tileAndElev >> 28;
|
||||||
|
|
||||||
fo::func::tile_coord(tileNum, &tileX, &tileY);
|
fo::func::tile_coord(tileNum, &tileX, &tileY);
|
||||||
squareNum = fo::func::square_num(tileX, tileY, elevation);
|
squareNum = fo::func::square_num(tileX, tileY, elevation);
|
||||||
ctx.setReturn(fo::var::square[elevation][squareNum]);
|
squareData = fo::var::square[elevation][squareNum];
|
||||||
|
switch (mode) {
|
||||||
|
case 1:
|
||||||
|
result = (squareData >> 16) & 0xFFF; // roof
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
result = squareData; // raw data
|
||||||
|
default:
|
||||||
|
result = squareData & 0xFFF; // this is how opcode worked prior to 4.3.9
|
||||||
|
}
|
||||||
|
ctx.setReturn(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) op_modified_ini() {
|
void __declspec(naked) op_modified_ini() {
|
||||||
|
|||||||
Reference in New Issue
Block a user