itemfinder through sub_813F004

This commit is contained in:
PikalaxALT
2019-10-02 21:26:01 -04:00
parent d9ab841b0d
commit afd5f1f52f
7 changed files with 241 additions and 534 deletions
+4 -517
View File
@@ -5,519 +5,6 @@
.text
thumb_func_start sub_813EC8C
sub_813EC8C: @ 813EC8C
push {r4-r7,lr}
lsls r0, 24
lsrs r4, r0, 24
movs r2, 0
ldr r7, _0813ECE0 @ =gMapHeader
lsls r1, r4, 2
adds r0, r1, r4
lsls r3, r0, 3
ldr r5, _0813ECE4 @ =gTasks+0x8
adds r6, r1, 0
movs r1, 0
_0813ECA2:
lsls r0, r2, 1
adds r0, r3
adds r0, r5
strh r1, [r0]
adds r0, r2, 0x1
lsls r0, 24
lsrs r2, r0, 24
cmp r2, 0xF
bls _0813ECA2
ldr r0, [r7, 0x4]
adds r1, r4, 0
bl sub_813EE14
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
bne _0813ECFC
bl sub_813F3EC
ldr r0, _0813ECE8 @ =gTasks
adds r1, r6, r4
lsls r1, 3
adds r1, r0
movs r2, 0x14
ldrsh r0, [r1, r2]
cmp r0, 0x1
bne _0813ECF0
ldr r0, _0813ECEC @ =sub_813EDB0
str r0, [r1]
b _0813ED08
.align 2, 0
_0813ECE0: .4byte gMapHeader
_0813ECE4: .4byte gTasks+0x8
_0813ECE8: .4byte gTasks
_0813ECEC: .4byte sub_813EDB0
_0813ECF0:
ldr r0, _0813ECF8 @ =sub_813ED3C
str r0, [r1]
b _0813ED08
.align 2, 0
_0813ECF8: .4byte sub_813ED3C
_0813ECFC:
ldr r2, _0813ED10 @ =gUnknown_8416513
ldr r3, _0813ED14 @ =sub_813ED18
adds r0, r4, 0
movs r1, 0x2
bl DisplayItemMessageOnField
_0813ED08:
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0813ED10: .4byte gUnknown_8416513
_0813ED14: .4byte sub_813ED18
thumb_func_end sub_813EC8C
thumb_func_start sub_813ED18
sub_813ED18: @ 813ED18
push {r4,lr}
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24
movs r0, 0
movs r1, 0x1
bl ClearDialogWindowAndFrame
bl sub_80696C0
bl ScriptContext2_Disable
adds r0, r4, 0
bl DestroyTask
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_813ED18
thumb_func_start sub_813ED3C
sub_813ED3C: @ 813ED3C
push {r4-r7,lr}
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 2
adds r1, r0
lsls r6, r1, 3
ldr r7, _0813ED80 @ =gTasks+0x8
adds r4, r6, r7
movs r1, 0x6
ldrsh r0, [r4, r1]
movs r1, 0x19
bl __modsi3
lsls r0, 16
cmp r0, 0
bne _0813EDA2
movs r2, 0
ldrsh r0, [r4, r2]
movs r2, 0x2
ldrsh r1, [r4, r2]
bl GetPlayerDirectionTowardsHiddenItem
lsls r0, 24
lsrs r5, r0, 24
movs r1, 0x8
ldrsh r0, [r4, r1]
cmp r0, 0
bne _0813ED88
adds r0, r7, 0
subs r0, 0x8
adds r0, r6, r0
ldr r1, _0813ED84 @ =sub_813F364
str r1, [r0]
b _0813EDA8
.align 2, 0
_0813ED80: .4byte gTasks+0x8
_0813ED84: .4byte sub_813F364
_0813ED88:
movs r0, 0x41
bl PlaySE
ldrb r0, [r4, 0xA]
adds r1, r5, 0
bl sub_813F40C
ldrh r0, [r4, 0xA]
adds r0, 0x1
strh r0, [r4, 0xA]
ldrh r0, [r4, 0x8]
subs r0, 0x1
strh r0, [r4, 0x8]
_0813EDA2:
ldrh r0, [r4, 0x6]
adds r0, 0x1
strh r0, [r4, 0x6]
_0813EDA8:
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_813ED3C
thumb_func_start sub_813EDB0
sub_813EDB0: @ 813EDB0
push {r4-r6,lr}
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 2
adds r1, r0
lsls r5, r1, 3
ldr r6, _0813EDE4 @ =gTasks+0x8
adds r4, r5, r6
movs r1, 0x6
ldrsh r0, [r4, r1]
movs r1, 0x19
bl __modsi3
lsls r0, 16
cmp r0, 0
bne _0813EE08
movs r1, 0x8
ldrsh r0, [r4, r1]
cmp r0, 0
bne _0813EDEC
adds r0, r6, 0
subs r0, 0x8
adds r0, r5, r0
ldr r1, _0813EDE8 @ =sub_813F3A8
str r1, [r0]
b _0813EE0E
.align 2, 0
_0813EDE4: .4byte gTasks+0x8
_0813EDE8: .4byte sub_813F3A8
_0813EDEC:
movs r0, 0x41
bl PlaySE
bl sub_813F5AC
lsls r0, 24
lsrs r0, 24
strh r0, [r4, 0xE]
ldrh r0, [r4, 0xA]
adds r0, 0x1
strh r0, [r4, 0xA]
ldrh r0, [r4, 0x8]
subs r0, 0x1
strh r0, [r4, 0x8]
_0813EE08:
ldrh r0, [r4, 0x6]
adds r0, 0x1
strh r0, [r4, 0x6]
_0813EE0E:
pop {r4-r6}
pop {r0}
bx r0
thumb_func_end sub_813EDB0
thumb_func_start sub_813EE14
sub_813EE14: @ 813EE14
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x4
mov r8, r0
lsls r1, 24
lsrs r1, 24
mov r9, r1
mov r4, sp
adds r4, 0x2
mov r0, sp
adds r1, r4, 0
bl PlayerGetDestCoords
ldr r1, _0813EEC8 @ =gTasks
mov r2, r9
lsls r0, r2, 2
add r0, r9
lsls r0, 3
adds r0, r1
movs r1, 0
strh r1, [r0, 0xC]
movs r3, 0
mov r0, r8
ldrb r0, [r0, 0x3]
cmp r3, r0
bge _0813EF04
_0813EE4E:
lsls r3, 16
asrs r1, r3, 16
mov r0, r8
ldr r2, [r0, 0x10]
lsls r0, r1, 1
adds r0, r1
lsls r7, r0, 2
adds r1, r7, r2
ldrb r0, [r1, 0x5]
mov r10, r3
cmp r0, 0x7
bne _0813EEF2
ldr r0, [r1, 0x8]
movs r1, 0x1
bl sub_80CC44C
lsls r0, 16
lsrs r0, 16
bl FlagGet
lsls r0, 24
cmp r0, 0
bne _0813EEF2
mov r1, r8
ldr r2, [r1, 0x10]
adds r2, r7, r2
ldrh r0, [r2]
adds r0, 0x7
mov r1, sp
ldrh r1, [r1]
subs r0, r1
lsls r0, 16
lsrs r5, r0, 16
ldrh r0, [r2, 0x2]
adds r0, 0x7
mov r3, sp
ldrh r1, [r3, 0x2]
subs r0, r1
lsls r0, 16
lsrs r4, r0, 16
adds r6, r4, 0
ldr r0, [r2, 0x8]
movs r1, 0x3
bl sub_80CC44C
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1
bne _0813EECC
cmp r5, 0
bne _0813EEF2
cmp r4, 0
bne _0813EEF2
mov r1, r8
ldr r0, [r1, 0x10]
adds r0, r7, r0
ldr r1, [r0, 0x8]
mov r0, r9
bl sub_813EF40
b _0813EF2E
.align 2, 0
_0813EEC8: .4byte gTasks
_0813EECC:
lsls r0, r5, 16
asrs r1, r0, 16
movs r2, 0xE0
lsls r2, 11
adds r0, r2
lsrs r0, 16
cmp r0, 0xE
bhi _0813EEF2
lsls r0, r6, 16
asrs r2, r0, 16
movs r3, 0x5
negs r3, r3
cmp r2, r3
blt _0813EEF2
cmp r2, 0x5
bgt _0813EEF2
mov r0, r9
bl sub_813F220
_0813EEF2:
movs r0, 0x80
lsls r0, 9
add r0, r10
lsrs r3, r0, 16
asrs r0, 16
mov r1, r8
ldrb r1, [r1, 0x3]
cmp r0, r1
blt _0813EE4E
_0813EF04:
mov r0, r9
bl sub_813F108
ldr r0, _0813EF24 @ =gTasks
mov r2, r9
lsls r1, r2, 2
add r1, r9
lsls r1, 3
adds r1, r0
movs r3, 0xC
ldrsh r0, [r1, r3]
cmp r0, 0x1
beq _0813EF28
movs r0, 0
b _0813EF30
.align 2, 0
_0813EF24: .4byte gTasks
_0813EF28:
mov r0, r9
bl sub_813EF9C
_0813EF2E:
movs r0, 0x1
_0813EF30:
add sp, 0x4
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_813EE14
thumb_func_start sub_813EF40
sub_813EF40: @ 813EF40
push {r4,r5,lr}
adds r5, r1, 0
lsls r0, 24
lsrs r0, 24
lsls r4, r0, 2
adds r4, r0
lsls r4, 3
ldr r0, _0813EF8C @ =gTasks+0x8
adds r4, r0
adds r0, r5, 0
movs r1, 0x1
bl sub_80CC44C
ldr r1, _0813EF90 @ =gSpecialVar_0x8004
strh r0, [r1]
adds r0, r5, 0
movs r1, 0
bl sub_80CC44C
ldr r1, _0813EF94 @ =gSpecialVar_0x8005
strh r0, [r1]
ldr r0, _0813EF98 @ =gSpecialVar_0x8006
movs r5, 0x1
strh r5, [r0]
ldrh r1, [r1]
movs r0, 0
bl TV_PrintIntToStringVar
strh r5, [r4, 0x4]
movs r0, 0
strh r0, [r4]
strh r0, [r4, 0x2]
movs r0, 0x3
strh r0, [r4, 0x8]
strh r5, [r4, 0xC]
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_0813EF8C: .4byte gTasks+0x8
_0813EF90: .4byte gSpecialVar_0x8004
_0813EF94: .4byte gSpecialVar_0x8005
_0813EF98: .4byte gSpecialVar_0x8006
thumb_func_end sub_813EF40
thumb_func_start sub_813EF9C
sub_813EF9C: @ 813EF9C
push {r4,lr}
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 2
adds r1, r0
lsls r1, 3
ldr r0, _0813EFEC @ =gTasks+0x8
adds r1, r0
ldrh r3, [r1, 0x2]
ldrh r2, [r1]
movs r4, 0
ldrsh r0, [r1, r4]
cmp r0, 0
bne _0813EFBC
cmp r3, 0
beq _0813EFF8
_0813EFBC:
movs r4, 0
ldrsh r0, [r1, r4]
cmp r0, 0
bge _0813EFCA
negs r0, r0
lsls r0, 16
lsrs r2, r0, 16
_0813EFCA:
movs r4, 0x2
ldrsh r0, [r1, r4]
cmp r0, 0
bge _0813EFD8
negs r0, r0
lsls r0, 16
lsrs r3, r0, 16
_0813EFD8:
lsls r0, r2, 16
asrs r2, r0, 16
lsls r0, r3, 16
asrs r0, 16
cmp r2, r0
ble _0813EFF0
cmp r2, 0x3
ble _0813EFF8
movs r0, 0x2
b _0813EFFA
.align 2, 0
_0813EFEC: .4byte gTasks+0x8
_0813EFF0:
cmp r0, 0x3
ble _0813EFF8
movs r0, 0x2
b _0813EFFA
_0813EFF8:
movs r0, 0x4
_0813EFFA:
strh r0, [r1, 0x8]
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_813EF9C
thumb_func_start sub_813F004
sub_813F004: @ 813F004
push {r4,r5,lr}
lsls r1, 16
lsrs r1, 16
lsls r2, 16
lsrs r2, 16
ldrb r5, [r0, 0x3]
ldr r4, [r0, 0x10]
movs r3, 0
cmp r3, r5
bge _0813F066
lsls r0, r1, 16
asrs r1, r0, 16
lsls r0, r2, 16
asrs r2, r0, 16
_0813F020:
ldrb r0, [r4, 0x5]
cmp r0, 0x7
bne _0813F05E
ldrh r0, [r4]
cmp r1, r0
bne _0813F05E
ldrh r0, [r4, 0x2]
cmp r2, r0
bne _0813F05E
ldr r0, [r4, 0x8]
movs r1, 0x1
bl sub_80CC44C
lsls r0, 16
lsrs r5, r0, 16
ldr r0, [r4, 0x8]
movs r1, 0x3
bl sub_80CC44C
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1
beq _0813F066
adds r0, r5, 0
bl FlagGet
lsls r0, 24
cmp r0, 0
bne _0813F066
movs r0, 0x1
b _0813F068
_0813F05E:
adds r4, 0xC
adds r3, 0x1
cmp r3, r5
blt _0813F020
_0813F066:
movs r0, 0
_0813F068:
pop {r4,r5}
pop {r1}
bx r1
thumb_func_end sub_813F004
thumb_func_start sub_813F070
sub_813F070: @ 813F070
push {r4-r6,lr}
@@ -950,14 +437,14 @@ sub_813F364: @ 813F364
push {lr}
lsls r0, 24
lsrs r0, 24
ldr r2, _0813F378 @ =gUnknown_8416476
ldr r2, _0813F378 @ =gText_ItemfinderResponding
ldr r3, _0813F37C @ =sub_813F380
movs r1, 0x2
bl DisplayItemMessageOnField
pop {r0}
bx r0
.align 2, 0
_0813F378: .4byte gUnknown_8416476
_0813F378: .4byte gText_ItemfinderResponding
_0813F37C: .4byte sub_813F380
thumb_func_end sub_813F364
@@ -985,14 +472,14 @@ sub_813F3A8: @ 813F3A8
push {lr}
lsls r0, 24
lsrs r0, 24
ldr r2, _0813F3BC @ =gUnknown_84164BE
ldr r2, _0813F3BC @ =gText_ItemfinderShakingWildly
ldr r3, _0813F3C0 @ =sub_813F3C4
movs r1, 0x2
bl DisplayItemMessageOnField
pop {r0}
bx r0
.align 2, 0
_0813F3BC: .4byte gUnknown_84164BE
_0813F3BC: .4byte gText_ItemfinderShakingWildly
_0813F3C0: .4byte sub_813F3C4
thumb_func_end sub_813F3A8
+3 -3
View File
@@ -582,13 +582,13 @@ gUnknown_8416425:: @ 8416425
gUnknown_8416451:: @ 8416451
.string "You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}$"
gUnknown_8416476:: @ 8416476
gText_ItemfinderResponding:: @ 8416476
.string "Huh?\nThe ITEMFINDER's responding!\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}$"
gUnknown_84164BE:: @ 84164BE
gText_ItemfinderShakingWildly:: @ 84164BE
.string "Oh!\nThe ITEMFINDER's shaking wildly!\pThere's an item buried underfoot!\p {PAUSE_UNTIL_PRESS}$"
gUnknown_8416513:: @ 8416513
gText_NopeTheresNoResponse:: @ 8416513
.string " Nope!\nThere's no response.{PAUSE_UNTIL_PRESS}$"
gUnknown_8416537:: @ 8416537
+1
View File
@@ -14,5 +14,6 @@ u8 ContextNpcGetTextColor(void);
void set_unknown_box_id(u8);
u16 get_unknown_box_id(void);
bool8 sub_80CC7B4(void);
u16 sub_80CC44C(struct HiddenItemStruct hiddenItem, u8 attr);
#endif // GUARD_FIELD_SPECIALS_H
+22 -14
View File
@@ -120,26 +120,34 @@ struct CoordEvent
u8 *script;
};
struct HiddenItemStruct
{
u32 field_00:16;
u32 hiddenItemId:8; // flag offset to determine flag lookup
u32 field_03_0:7;
u32 field_03_7:1;
};
union BgUnion
{ // carried over from diego's FR/LG work, seems to be the same struct
// in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union.
u8 *script;
// hidden item type probably
struct HiddenItemStruct hiddenItem;
// secret base type
u32 secretBaseId;
};
struct BgEvent
{
u16 x, y;
u8 unk4;
u8 kind;
// 0x2 padding for the union beginning.
union { // carried over from diego's FR/LG work, seems to be the same struct
// in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union.
u8 *script;
// hidden item type probably
struct {
u8 filler6[0x2];
u16 hiddenItemId; // flag offset to determine flag lookup
} hiddenItem;
// secret base type
u32 secretBaseId;
} bgUnion;
union BgUnion bgUnion;
};
struct MapEvents
+5
View File
@@ -324,4 +324,9 @@ extern const u8 gText_ThrowAwayStrVar2OfThisItemQM[];
extern const u8 gText_BerryPouch[];
extern const u8 gText_TheBerryPouchWillBePutAway[];
// itemfinder
extern const u8 gText_ItemfinderResponding[];
extern const u8 gText_ItemfinderShakingWildly[];
extern const u8 gText_NopeTheresNoResponse[];
#endif //GUARD_STRINGS_H
+2
View File
@@ -252,6 +252,7 @@ SECTIONS {
asm/wild_pokemon_area.o(.text);
src/dynamic_placeholder_text_util.o(.text);
src/berry_pouch.o(.text);
src/itemfinder.o(.text);
asm/itemfinder.o(.text);
src/buy_menu_helpers.o(.text);
src/slot_machine.o(.text);
@@ -467,6 +468,7 @@ SECTIONS {
data/wild_pokemon_area.o(.rodata);
src/dynamic_placeholder_text_util.o(.rodata);
src/berry_pouch.o(.rodata);
src/itemfinder.o(.rodata);
data/itemfinder.o(.rodata);
src/buy_menu_helpers.o(.rodata);
src/slot_machine.o(.rodata);
+204
View File
@@ -0,0 +1,204 @@
#include "global.h"
#include "task.h"
#include "new_menu_helpers.h"
#include "strings.h"
#include "map_obj_lock.h"
#include "script.h"
#include "sound.h"
#include "event_data.h"
#include "field_player_avatar.h"
#include "field_specials.h"
#include "constants/songs.h"
void sub_813ED18(u8 taskId);
void sub_813ED3C(u8 taskId);
void sub_813EDB0(u8 taskId);
bool8 sub_813EE14(struct MapEvents *events, u8 taskId);
void sub_813EF9C(u8 taskId);
void sub_813F108(u8 taskId);
void sub_813F220(u8 taskId, s16 dx, s16 dy);
u8 GetPlayerDirectionTowardsHiddenItem(s16 x, s16 y);
void sub_813F364(u8 taskId);
void sub_813F3A8(u8 taskId);
void sub_813F3EC(void);
void sub_813F40C(u8 palIdx, u8 direction);
u8 sub_813F5AC(void);
void sub_813EF40(u8 taskId, struct HiddenItemStruct hiddenItem);
void sub_813EC8C(u8 taskId)
{
u8 i;
for (i = 0; i < 16; i++)
gTasks[taskId].data[i] = 0;
if (sub_813EE14(gMapHeader.events, taskId) == TRUE)
{
sub_813F3EC();
if (gTasks[taskId].data[6] == 1)
gTasks[taskId].func = sub_813EDB0;
else
gTasks[taskId].func = sub_813ED3C;
}
else
{
DisplayItemMessageOnField(taskId, 2, gText_NopeTheresNoResponse, sub_813ED18);
}
}
void sub_813ED18(u8 taskId)
{
ClearDialogWindowAndFrame(0, TRUE);
sub_80696C0();
ScriptContext2_Disable();
DestroyTask(taskId);
}
void sub_813ED3C(u8 taskId)
{
s16 * data = gTasks[taskId].data;
u8 direction;
if (data[3] % 25 == 0)
{
direction = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]);
if (data[4] == 0)
{
gTasks[taskId].func = sub_813F364;
return;
}
else
{
PlaySE(SE_TOY_F);
sub_813F40C(data[5], direction);
data[5]++;
data[4]--;
}
}
data[3]++;
}
void sub_813EDB0(u8 taskId)
{
s16 * data = gTasks[taskId].data;
if (data[3] % 25 == 0)
{
if (data[4] == 0)
{
gTasks[taskId].func = sub_813F3A8;
return;
}
else
{
PlaySE(SE_TOY_F);
data[7] = sub_813F5AC();
data[5]++;
data[4]--;
}
}
data[3]++;
}
bool8 sub_813EE14(struct MapEvents *events, u8 taskId)
{
s16 x, y, i, dx, dy;
PlayerGetDestCoords(&x, &y);
gTasks[taskId].data[2] = 0;
for (i = 0; i < events->bgEventCount; i++)
{
if (events->bgEvents[i].kind == 7 && !FlagGet(sub_80CC44C(events->bgEvents[i].bgUnion.hiddenItem, 1)))
{
dx = events->bgEvents[i].x + 7 - x;
dy = events->bgEvents[i].y + 7 - y;
if (sub_80CC44C(events->bgEvents[i].bgUnion.hiddenItem, 3) == TRUE)
{
if (dx == 0 && dy == 0)
{
sub_813EF40(taskId, events->bgEvents[i].bgUnion.hiddenItem);
return TRUE;
}
}
else if (
dx >= -7
&& dx <= 7
&& dy >= -5
&& dy <= 5
)
{
sub_813F220(taskId, dx, dy);
}
}
}
sub_813F108(taskId);
if (gTasks[taskId].data[2] == 1)
{
sub_813EF9C(taskId);
return TRUE;
}
return FALSE;
}
void sub_813EF40(u8 taskId, struct HiddenItemStruct hiddenItem)
{
s16 * data = gTasks[taskId].data;
gSpecialVar_0x8004 = sub_80CC44C(hiddenItem, 1);
gSpecialVar_0x8005 = sub_80CC44C(hiddenItem, 0);
gSpecialVar_0x8006 = 1;
TV_PrintIntToStringVar(0, gSpecialVar_0x8005);
data[2] = 1;
data[0] = 0;
data[1] = 0;
data[4] = 3;
data[6] = 1;
}
void sub_813EF9C(u8 taskId)
{
s16 * data = gTasks[taskId].data;
s16 r3 = data[1];
s16 r2 = data[0];
if (data[0] == 0 && data[1] == 0)
data[4] = 4;
else
{
if (data[0] < 0)
r2 = data[0] * -1;
if (data[1] < 0)
r3 = data[1] * -1;
if (r2 > r3)
{
if (r2 > 3)
data[4] = 2;
else
data[4] = 4;
}
else
{
if (r3 > 3)
data[4] = 2;
else
data[4] = 4;
}
}
}
bool8 sub_813F004(struct MapEvents *events, s16 x, s16 y)
{
s32 i;
u16 eventFlag;
s32 bgEventCount = events->bgEventCount;
struct BgEvent *bgEvents = events->bgEvents;
for (i = 0; i < bgEventCount; i++)
{
if (
bgEvents[i].kind == 7
&& x == bgEvents[i].x
&& y == bgEvents[i].y
)
{
eventFlag = sub_80CC44C(bgEvents[i].bgUnion.hiddenItem, 1);
if (sub_80CC44C(bgEvents[i].bgUnion.hiddenItem, 3) != TRUE && !FlagGet(eventFlag))
return TRUE;
else
return FALSE;
}
}
return FALSE;
}