jiangzhengwenjz 发表于 2018-11-16 16:33:31

JZW 2016未发布的一些改版代码【原创】

本帖最后由 jiangzhengwenjz 于 2018-11-18 06:08 编辑

时间过得真快,今天把2年前做的一些东西拿出来共享下,不过由于是从project里直接拉出来的所以很多不能编译。想要应用的朋友拿出你的实力吧,稍加改动或是添加素材即可。阅读需相当的ASM与C知识,以及改版经验!
禁止将代码用于你发布的ROM!    转载请注明原贴!

1. minihack: 道具型“训练师卡片”:
一个很有意思的程序,只需让道具数据指向它即可。火红的这个系统多次malloc后会crash,用init_malloc()来解决。不过现在看来也许是没有free()?也懒得去看了
https://i.imgur.com/fC9Qi9I.gif.thumb
.global p_trainer_function
p_trainer_function:
push {r4, lr}
mov r4, r0
ldr r1, =0x3005090
lsl r0, r4, #2
add r0, r0, r4
lsl r0, r0, #3
add r0, r0, r1
ldrh r0,
bl trainer_card_modified
mov r0, r4
ldr r1, =task_del
bl bx_r1
pop {r4, pc}

trainer_card_modified:
push {r4, lr}
mov r4, r0
ldr r0, =0x2037AB8
ldrb r1,
mov r0, #0x80
and r0, r1
cmp r0, #0
beq real
mov r0, #0
pop {r4, pc}

real:
ldr r1, =0x807B005
bl bx_r1
cmp r4, #0
bne backtoow
ldr r0, =backtobagfunc+1
b mainhandler

backtoow:
ldr r0, =backtoowfunc+1

mainhandler:
ldr r1, =0x808B699
bl bx_r1
pop {r4, pc}
.ltorg

backtobagfunc:
push {lr}
ldr r0, =0x2000000
ldr r1, =0x1c000
ldr r2, =0x8002B81
bl bx_r2
ldr r1, =0x8107EB9
bl bx_r1
pop {pc}
.ltorg

backtoowfunc:
push {lr}
ldr r0, =0x2000000
ldr r1, =0x1c000
ldr r2, =0x8002B81
bl bx_r2
ldr r1, =0x80567DD
bl bx_r1
pop {pc}
.ltorg

bx_r1: bx r1
bx_r2: bx r22. 新型钓鱼系统:
挺复杂的一个连续回调系统,选择不同的钓饵,但是并没有做相应的遇怪系统(虽然很简单)。主逻辑用C解决
https://i.imgur.com/EsRtdu3.gif;fish hack
.org 0x805D30C
ldr r1, =ultrarod_task_hook|1
bx r1
.pool
.org 0x805D350
ldr r0, =ultrarod_chooser_hook|1
bx r0
.pool/*hook via r1 at 0x805D30C*/
.global ultrarod_task_hook
.global ultrarod_chooser_hook
ultrarod_task_hook:
ldr r2, =0x3005090
lsl r1, r0, #2
add r1, r1, r0
lsl r1, r1, #3
add r4, r1, r2
ldrh r0,
cmp r0, #3
bne normal_fishing
ldr r0, =task_bait_choose+1
ldr r3, =task_find_id_by_funcptr
bl bx_r3
cmp r0, #0xFF
bne bait_choosing

normal_fishing:
ldr r0, =0x805D317
bx r0

bait_choosing:
pop {r4, r5, pc}
.ltorg

/*hook via r0 at 0x805D350*/
ultrarod_chooser_hook:
ldrh r0,
cmp r0, #3
bne back
ldr r0, =task_bait_choose+1
mov r1, #0x50
ldr r3, =task_add
bl bx_r3
mov r0, #0

back:
pop {r4, pc}
.ltorg

bx_r3: bx r3
#include <funcs.h>
#define bait_index_start 0x63

void stringnospecifiedbait_print(void);
void baitpalfade(u8 mode);
extern const unsigned int MugBoxTileTiles;
extern const unsigned int MugBoxTilePal;
extern struct oam oam32x32_prio0;
extern struct image_frame* anim_null_ptr;
extern struct image_frame* anim_flip_ptr;
extern struct rotscale * rotscale_null_ptr;
extern u16* char_name_rbox_draw_rectangle_around;
extern u16* pal_rbox_draw_rectangle_around;
extern void**image_buffer_ptr;
extern void**image_buffer_ptr2;
extern struct task *tasks;
extern struct superstate*super;
extern struct obj*objects;
const struct rbox_short bait_boxes[] __attribute__((aligned(4))) = {
        {0,3,5,3,3,0xF,0x38},
        {0,10,5,3,3,0xF,0x38},
        {0,17,5,3,3,0xF,0x38},
        {0,24,5,3,3,0xF,0x38},
        {0,3,0xD,24,4,0xF,0x41}
};

const struct objtemplate bait_templates[] __attribute__((aligned(4))) = {
        {0x1600,0x1600,&oam32x32_prio0,&anim_null_ptr,(void*)0,&rotscale_null_ptr,objc_nullsub},
        {0x1601,0x1601,&oam32x32_prio0,&anim_null_ptr,(void*)0,&rotscale_null_ptr,objc_nullsub},
        {0x1602,0x1602,&oam32x32_prio0,&anim_null_ptr,(void*)0,&rotscale_null_ptr,objc_nullsub},
        {0x1603,0x1603,&oam32x32_prio0,&anim_null_ptr,(void*)0,&rotscale_null_ptr,objc_nullsub}
};

const char stringchoosebait[] = {
        0x0B, 0x0D, 0x0E, 0x8A, 0x10, 0x06, 0x0F, 0x0B, 0x10, 0xA7, 0x03, 0x3D, 0x03, 0xA1, 0x37, 0xFF
};

const char stringnospecifiedbait[] = {
        0x09, 0x53, 0x0F, 0x7E, 0x10, 0x55, 0x10, 0xA7, 0x03, 0x3D, 0x03, 0xA1, 0x07, 0x7D, 0x02, 0x51, 0x0B, 0xF1, 0x03, 0x2A, 0x3B, 0xFE, 0x09, 0xD9, 0x10, 0x59, 0x0F, 0x24, 0x0D, 0x70, 0x07, 0xE3, 0x03, 0x3D, 0x04, 0x37, 0x07, 0x7D, 0x09, 0xD2, 0x03, 0x3D, 0x03, 0x04, 0x0F, 0x91, 0x08, 0x9E, 0x3D, 0xFF
};
extern u8 Bait1Tiles;
extern u8 Bait2Tiles;
extern u8 Bait3Tiles;
extern u8 Bait4Tiles;
extern u8 Bait1Pal;
extern u8 Bait2Pal;
extern u8 Bait3Pal;
extern u8 Bait4Pal;
const void* baitimagepointers[] __attribute__((aligned(4))) = {
        &Bait1Tiles,
        &Bait2Tiles,
        &Bait3Tiles,
        &Bait4Tiles
};

const struct pal_graphic baitpalette[] __attribute__((aligned(4))) = {
        {&Bait1Pal,0x1600,0},
        {&Bait2Pal,0x1601,0},
        {&Bait3Pal,0x1602,0},
        {&Bait4Pal,0x1603,0}
};

void task_bait_choose(u8 task_id)
{
        int i;
        u8 rboxid;
        struct graphic temp;
        switch ((tasks+task_id)->priv)
        {
                case 0:
                gpu_copy_to_tileset(0,MugBoxTileTiles,0x120,0x21D);
                gpu_pal_apply(MugBoxTilePal,0xD0,0x20);
                gpu_pal_apply((u16*)0x8471DEC,0xF0,0x20);
                for (i = 0; i < 4; i++)
                {
                        rboxid = rbox_spawn(bait_boxes+i);
                        (tasks+task_id)->priv = rboxid;
                        rboxid_bg_prepare(rboxid);
                        *char_name_rbox_draw_rectangle_around = 0x21D;
                        *pal_rbox_draw_rectangle_around = 0xD;
                        rboxid_unpack_and_call(rboxid,rbox_draw_rectangle_around);
                        rboxid_fill_pixels(rboxid,0x11);//white
                        rboxid_bg_prepare(rboxid);
                        rboxid_upload_and_tilemap_send(rboxid,3);
                }
                rboxid = rbox_spawn(bait_boxes+4);
                (tasks+task_id)->priv = rboxid;
                rboxid_bg_prepare(rboxid);
                *char_name_rbox_draw_rectangle_around = 0x21D;
                *pal_rbox_draw_rectangle_around = 0xD;
                rboxid_unpack_and_call(rboxid,rbox_draw_rectangle_around);
                rboxid_fill_pixels(rboxid,0x11);//white
                rboxid_bg_prepare(rboxid);
                rboxid_upload_and_tilemap_send(rboxid,3);
                rboxid_print(rboxid,2,stringchoosebait,48,9,0,0);
                bgid_mark_for_sync(0);
                break;
                case 1:
                item_image_expand_buffer_malloc();
                for (i = 0; i < 4; ++i)
                {
                        LZ77UnCompWram(baitimagepointers,*image_buffer_ptr);
                        item_24x24_to_32x32(*image_buffer_ptr,*image_buffer_ptr2);
                        temp.img = *image_buffer_ptr2;
                        temp.size = 0x200;
                        temp.tag = 0x1600+i;
                        gpu_tile_obj_alloc_tag_and_upload(&temp);
                        gpu_pal_obj_alloc_tag_and_apply_2(baitpalette+i);
                        (tasks+task_id)->priv = template_instanciate_forward_search(bait_templates+i,40+i*56,56,0);
                }
                free(*image_buffer_ptr);
                free(*image_buffer_ptr2);
                baitpalfade(0);
                break;
                case 2:
                if(super->buttons3_new_remapped != 1) //not A
                {
                        if(super->buttons3_new_remapped == 0) //no buttons
                                return;
                        if(super->buttons3_new_remapped == 0x10) //RIGHT
                        {
                                if((tasks+task_id)->priv == 3)
                                        return;
                                else
                                {
                                        ++(tasks+task_id)->priv;
                                        baitpalfade((tasks+task_id)->priv);
                                        return;
                                }
                        }
                        else if(super->buttons3_new_remapped == 0x20) //LEFT
                        {
                                if((tasks+task_id)->priv == 0)
                                        return;
                                else
                                {
                                        --(tasks+task_id)->priv;
                                        baitpalfade((tasks+task_id)->priv);
                                        return;
                                }
                        }
                        return;
                }
                else break;
                case 3:
                for (i=0; i<4; ++i)
                {       
                        rboxid_80040B8((tasks+task_id)->priv);
                        pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1600+i) << 4),16,0,0);
                        obj_delete_and_free_associated_resources(objects+(tasks+task_id)->priv);
                        rboxid_flush((tasks+task_id)->priv,1);
                        rboxid_upload_and_tilemap_send((tasks+task_id)->priv,2);
                        rboxid_free((tasks+task_id)->priv);
                }
                rboxid_80040B8((tasks+task_id)->priv);
                rboxid_flush((tasks+task_id)->priv,1);
                rboxid_upload_and_tilemap_send((tasks+task_id)->priv,2);
                rboxid_free((tasks+task_id)->priv);
                break;
                case 4:
                if(!check_item_2(bait_index_start+(tasks+task_id)->priv,1))
                {
                        stringnospecifiedbait_print();
                        break;
                }
                else
                {       
                        bag_remove_item(bait_index_start+(tasks+task_id)->priv,1);
                        task_del(task_id);
                        return;
                }
                case 5:
                if(super->buttons3_new_remapped&1 || super->buttons3_new_remapped&2)
                {       
                        (tasks+task_find_id_by_funcptr(0x805D305))->priv=0xF;//goto fishF
                        task_del(task_id);
                }
                else return;
                default:
                break;
        }
        ++(tasks+task_id)->priv;
        return;
}

void stringnospecifiedbait_print()
{
        box_border_curve_load_tiles_and_pal(0,1);
        rboxid_fill_pixels(0,0x11);
        rboxid_print(0,2,stringnospecifiedbait,1,1,0,0);
        return;
}

void baitpalfade(u8 mode)
{
        if(mode!=0)
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1600) << 4),16,12,0);
        else
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1600) << 4),16,0,0);
        if(mode!=1)
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1601) << 4),16,12,0);
        else
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1601) << 4),16,0,0);
        if(mode!=2)
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1602) << 4),16,12,0);
        else
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1602) << 4),16,0,0);
        if(mode!=3)
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1603) << 4),16,12,0);
        else
                pal_fade_1(0x100+(gpu_pal_tags_index_of(0x1603) << 4),16,0,0);
        return;
}3. 对战前动画,以及多向滑动背景
https://i.imgur.com/9nlvjCI.gif.org 0x807FF90
ldr r0, =pre_battle_anim_load_type+1
bx r0
.pool

.org 0x80D0A58
.word pre_battle_anim_type_functions

.org 0x80D0A88
.word pre_battle_anim_type_functions

.org 0x80D09E8
.word pre_battle_anim_fade_functions

.org 0x80D0A20
.word pre_battle_anim_fade_functions#include <funcs.h>
u16* char_name_rbox_draw_rectangle_around = (u16*)0x203ADF0;
u16* pal_rbox_draw_rectangle_around = (u16*)0x203ADF2;
void**image_buffer_ptr = (void**)0x2039884;
void**image_buffer_ptr2 = (void**)0x2039888;
struct task *tasks = (struct task*)0x3005090;
struct superstate*super = (struct superstate*)0x30030F0;
struct obj*objects = (struct obj*)0x202063C;
vu16 *VCOUNT = (vu16*)0x4000006;
vu16 *BG0HOFS = (vu16*)0x4000010;
u16* var_8000 = (u16*)0x20370B8;
u16* var_8001 = (u16*)0x20370BA;
u16* var_8002 = (u16*)0x20370BC;
u16* var_8003 = (u16*)0x20370BE;
u16* var_8004 = (u16*)0x20370C0;
u16* var_8005 = (u16*)0x20370C2;
u16* var_8006 = (u16*)0x20370C4;
u16* var_8007 = (u16*)0x20370C6;
u16* var_800A = (u16*)0x20370CC;
u16* var_800B = (u16*)0x20370CE;/* Generated by BIN2S - please don't edit directly */
        .section .rodata
        .balign 4
        .global x3tm_LZ_bin_size
        .global x3tm_LZ_bin
x3tm_LZ_bin:
        .byte16,0,5,0, 63,0,240,240,1,240,1,240,1,240,1,240
        .byte   1,240,1,224,240,1,240,1, 16,1,3,240,4,240,5,0
        .byte 240,6,240,6,244,5,244,4, 14,244,3,244,0, 80,1,240
        .byte43,224,1,7,2,240,8,240,9,240,1, 48,1,244,131, 16
        .byte   1,9,244,8,244,7,240, 63,240,1,142,0,1, 10,240, 11
        .byte80, 59, 96, 63, 16,1, 11, 51,244, 10,240, 63,240,1,240, 13
        .byte 144, 61,128, 63, 24,1,244, 13,240, 63,224,1, 14,240, 15,198
        .byte 240, 63, 64,1, 15,244, 14,240, 63,192,1, 16,198,176, 61,160
        .byte63,1,244, 16,240, 63,192,1, 17,128,128, 59, 36,240, 37,240
        .byte37,244, 36,177,128, 63, 17,240, 63,192,1, 18,240, 19, 96,1
        .byte   0, 38,240, 39,240, 39,244, 38,244, 88, 19, 96,1, 18,240, 63
        .byte 192,1, 20,240, 21,128, 96,1, 40,240, 41,240, 41,244, 40, 44
        .byte 244, 21, 96,1, 20,240, 63,192,1, 22,240, 64,2, 96,1, 42
        .byte 240, 43,240, 43,244, 22, 42,244,2, 96,1, 22,240, 63,192,1
        .byte23,227,128, 63, 32,1,128, 61,2,244, 23,240, 63,192,1, 24
        .byte24,240, 25,240, 63, 64,1, 25,244, 24,219,240, 63,224,1, 26
        .byte 240, 63, 64,1, 26,242, 63,240,1, 12,240, 27,240, 28,240, 63
        .byte   0,1, 28,244,112, 27,240, 63,240,1,0,1, 29,240, 30,240
        .byte65, 31,160, 63, 31,244, 30,244, 29,243,129,192,240,1, 96,1
        .byte32,240, 33,240, 34,240,0, 35,240, 35,244, 34,244, 33,244,127
        .byte32,115,191,240, 63,240,1,240,1,240,1,240,1,240,1,192
        .byte 240,1,240,1,240,0,0,0

        .global x3tm_LZ_bin_end
x3tm_LZ_bin_end:

        .align
x3tm_LZ_bin_size: .int 344
.global pre_battle_anim_type_x12_functions
pre_battle_anim_type_x12_functions:
.word pre_battle_anim_type_x12_func1+1
.word pre_battle_anim_type_x12_func2+1#include <funcs.h>
extern u8 x3tm_LZ_bin;
extern struct task *tasks;
void pre_battle_anim_type_x12_hblank(void);
void pre_battle_anim_type_x12_helper(u8 task_id);
extern vu16 *VCOUNT;
extern vu16 *BG0HOFS;
u8 pre_battle_anim_type_x12_func1(struct task*task_addr)
{
        reg_ie_orr(2);
        hblank_handler_set(pre_battle_anim_type_x12_hblank+1);
        decompress_with_fallback(0,&x3tm_LZ_bin,0,0,1);
        gpu_copy_to_tileset(0,0x83F87A0,0x580,0);
        task_addr->priv++;
        gpu_pal_apply(0x83FA638,0xf0,0x20);
        tasks.priv=56;
        return 0;
}

u8 pre_battle_anim_type_x12_func2(struct task*task_addr)
{
        u8 x;
        x = task_find_id_by_funcptr(pre_battle_anim_type_x12_helper+1);
        if (x != 0xFF)
                return 0;
        else
        {
                if(task_addr->priv <= 0x10)
                {
                        pal_fade_1(0xf0,16,task_addr->priv,0x7fff);
                        task_addr->priv+=2;
                        return 0;
                }
                else
                {       
                        if(task_addr->priv <= 0x18)
                        {
                                task_addr->priv+=2;
                                return 0;
                        }
                        else
                        {       
                                pal_0_fade(0xFFFFFFFF,0x10,0);
                                task_del(task_find_id_by_funcptr(task_addr->fptr));
                        }
                }
        }
        return 0;
}

void pre_battle_anim_type_x12_hblank()
{
        u8 i;
        u16 j,k;
        i = task_find_id_by_funcptr(pre_battle_anim_type_x12_helper+1);
        if (i == 0xFF)
        {
                hblank_handler_set((void*)0);
                return;
        }
        else
        {
                j = *VCOUNT;
                k = tasks.priv;
                if(j <= 49)
                        *BG0HOFS = k;
                else
                        if(j <= 79)
                                *BG0HOFS = 256-k;
                        else
                                if(j <= 109)
                                        *BG0HOFS = k;
                                else
                                        *BG0HOFS = 256-k;
        }
        return;
}

void pre_battle_anim_type_x12_helper(u8 task_id)
{
        u16 i;
        i = tasks.priv;
        if(i)
                tasks.priv-=4;
        else
                task_del(task_id);
        return;
}.thumb
.global pre_battle_anim_type_x12
pre_battle_anim_type_x12:
push {lr}
lsl r0, r0, #0x18
lsr r0, r0, #0x18
ldr r2, =0x3005090
lsl r1, r0, #2
add r1, r1, r0
lsl r1, r1, #3
add r1, r1, r2
mov r2, #0
strh r2,
bl mainsub_x12
pop {pc}
.ltorg

mainsub_x12:
push {r4, r5, lr}
lsl r0, r0, #0x18
lsr r0, r0, #0x18
ldr r5, =pre_battle_anim_type_x12_functions
ldr r2, =0x3005090
lsl r1, r0, #2
add r1, r1, r0
lsl r1, r1, #3
add r4, r1, r2

loc_loop:
mov r1, #8
ldrsh r0,
lsl r0, r0, #2
add r0, r0, r5
ldr r1,
mov r0, r4
bl bx_r1
lsl r0, r0, #0x18
cmp r0, #0
bne loc_loop
pop {r4, r5, pc}

bx_r1:
bx r1
.thumb
.global pre_battle_anim_load_type
@hook via r0 at 0x807FF90
pre_battle_anim_load_type:
ldrb r2,
cmp r2, #0
beq normal
mov r0, r2
pop {r4-r6, pc}

normal:
ldrh r2,
lsl r0, r2, #2
add r0, r0, r2
lsl r0, r0, #3
add r0, r0, r1
ldr r1, =0x807ff9b
bx r1
.ltorg.global pre_battle_anim_type_functions
pre_battle_anim_type_functions:
.word 0x080D0ADD

.word 0x080D0BD5

.word 0x080D0D55

.word 0x080D0EE5

.word 0x080D13C9

.word 0x080D1639

.word 0x080D1B59

.word 0x080D1D2D

.word 0x080D316D

.word 0x080D33ED

.word 0x080D3819

.word 0x080D3929

.word 0x080D2769

.word 0x080D2789

.word 0x080D27A9

.word 0x080D27C9

.word 0x080D27E9

.word 0x080D1F2D

.word pre_battle_anim_type_x12+1.global pre_battle_anim_fade_functions
pre_battle_anim_fade_functions:
.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

.word 0x080D0A8D

jiangzhengwenjz 发表于 2018-11-16 16:43:26

本帖最后由 jiangzhengwenjz 于 2018-11-18 05:47 编辑

函数地址:
**** Hidden Message *****

感谢knizz和strange_kid

CHENXIJIANG 发表于 2018-11-18 12:51:42

不懂帮顶                  

1696774136 发表于 2019-1-27 15:29:31

不动帮顶

林书竹 发表于 2019-4-25 23:36:59

进来看看……

tlxxnl 发表于 2019-5-4 16:24:17

好高深……不懂帮顶

本站第一萌新 发表于 2019-7-23 11:00:36

非常感谢聚聚分享!
想研究ASM也挺久了,奈何一直找不到源码参照
顺便查看一下隐藏的函数地址

030330ma 发表于 2020-6-3 07:45:00

非常谢谢聚聚

s744865306 发表于 2021-1-15 19:58:37

好东西!看不懂……

744865306 发表于 2021-2-11 19:02:42

看看函数地址

喵1喵 发表于 2021-6-21 16:28:32

路过回复一下,谢谢
页: [1]
查看完整版本: JZW 2016未发布的一些改版代码【原创】