diff --git a/asm/include/overlay_29_02333FD0.inc b/asm/include/overlay_29_02333FD0.inc index a78d3287..d63a18eb 100644 --- a/asm/include/overlay_29_02333FD0.inc +++ b/asm/include/overlay_29_02333FD0.inc @@ -1,25 +1,6 @@ #pragma once -.public AbilityIsActiveVeneer -.public abs -.public AdvanceFrame -.public AnimationDelayOrSomething -.public DUNGEON_PTR -.public DungeonRandInt -.public EntityIsValid__023350D8 .public GendersEqualNotGenderless -.public GetLeader -.public GetWeatherColorTable .public GravityIsActive -.public HasHeldItem .public IsMonsterSleeping -.public IsSecretFloor .public IsThawingMove -.public LogMessageByIdWithPopupCheckUser .public MonsterIsType -.public ov29_022DE608 -.public ov29_022E5FE8 -.public ov29_02338A4C -.public ov29_02353562 -.public TryActivateArtificialWeatherAbilities -.public TryActivateWeather -.public TryWeatherFormChange diff --git a/asm/include/overlay_29_02334D58.inc b/asm/include/overlay_29_02334D58.inc new file mode 100644 index 00000000..baa90b34 --- /dev/null +++ b/asm/include/overlay_29_02334D58.inc @@ -0,0 +1,19 @@ +#pragma once +.public AdvanceFrame +.public AnimationDelayOrSomething +.public DUNGEON_PTR +.public DungeonRandInt +.public EntityIsValid__023350D8 +.public GetApparentWeather +.public GetLeader +.public GetWeatherColorTable +.public IsSecretFloor +.public LogMessageByIdWithPopupCheckUser +.public TryActivateArtificialWeatherAbilities +.public TryActivateWeather +.public TryWeatherFormChange +.public abs +.public ov29_022DE608 +.public ov29_022E5FE8 +.public ov29_02338A4C +.public ov29_02353562 diff --git a/asm/overlay_29_02333FD0.s b/asm/overlay_29_02333FD0.s index f51c1ed2..14d602a9 100644 --- a/asm/overlay_29_02333FD0.s +++ b/asm/overlay_29_02333FD0.s @@ -987,328 +987,3 @@ _02334CE8: and r0, r0, #0xff ldmia sp!, {r3, pc} arm_func_end ov29_02334CAC - - arm_func_start GetApparentWeather -GetApparentWeather: ; 0x02334D08 - stmdb sp!, {r4, lr} - movs r4, r0 - beq _02334D40 - mov r1, #0x6f - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _02334D34 - mov r0, r4 - mov r1, #0x34 - bl HasHeldItem -_02334D34: - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r4, pc} -_02334D40: - ldr r0, _02334D54 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0xc000 -#ifdef JAPAN - ldrb r0, [r0, #0xc94] -#else - ldrb r0, [r0, #0xd38] -#endif - ldmia sp!, {r4, pc} - .align 2, 0 -_02334D54: .word DUNGEON_PTR - arm_func_end GetApparentWeather - - arm_func_start ov29_02334D58 -ov29_02334D58: ; 0x02334D58 - stmdb sp!, {r3, lr} - bl IsSecretFloor - cmp r0, #0 - ldmneia sp!, {r3, pc} - ldr r0, _02334DA4 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x28000 -#ifdef JAPAN - ldrb r0, [r0, #0x612] -#else - ldrb r0, [r0, #0x6b6] -#endif - cmp r0, #8 - bne _02334D8C - mov r0, #8 - bl DungeonRandInt - and r0, r0, #0xff -_02334D8C: - bl ov29_02334DA8 - bl TryActivateArtificialWeatherAbilities - mov r0, #0 - mov r1, #1 - bl TryActivateWeather - ldmia sp!, {r3, pc} - .align 2, 0 -_02334DA4: .word DUNGEON_PTR - arm_func_end ov29_02334D58 - - arm_func_start ov29_02334DA8 -ov29_02334DA8: ; 0x02334DA8 -#ifdef JAPAN -#define OV29_02334DA8_OFFSET -0xA4 -#else -#define OV29_02334DA8_OFFSET 0 -#endif - ldr r3, _02334E6C ; =DUNGEON_PTR - mov r1, #0 - ldr r2, [r3] - add r2, r2, #0xc000 - strb r0, [r2, #0xd39 + OV29_02334DA8_OFFSET] - ldr r0, [r3] - add r0, r0, #0xc000 - ldrb r2, [r0, #0xd39 + OV29_02334DA8_OFFSET] - strb r2, [r0, #0xd38 + OV29_02334DA8_OFFSET] - ldr r0, [r3] - add r0, r0, #0xc000 - strb r1, [r0, #0xd5d + OV29_02334DA8_OFFSET] - mov r0, r1 -_02334DDC: - ldr r2, [r3] - add r2, r2, r1, lsl #1 -#ifdef JAPAN - add r2, r2, #0xcc00 - strh r0, [r2, #0x96] - ldr r2, [r3] - add r2, r2, r1, lsl #1 - add r2, r2, #0xcc00 - add r1, r1, #1 - strh r0, [r2, #0xa6] -#else - add r2, r2, #0xcd00 - strh r0, [r2, #0x3a] - ldr r2, [r3] - add r2, r2, r1, lsl #1 - add r2, r2, #0xcd00 - add r1, r1, #1 - strh r0, [r2, #0x4a] -#endif - cmp r1, #8 - blt _02334DDC - ldr r2, _02334E6C ; =DUNGEON_PTR - mov r3, #9 - ldr r1, [r2] - add r1, r1, #0xc000 - strb r3, [r1, #0xd5a + OV29_02334DA8_OFFSET] - ldr r1, [r2] - add r1, r1, #0xc000 - strb r0, [r1, #0xd5b + OV29_02334DA8_OFFSET] - ldr r1, [r2] - add r1, r1, #0xc000 - strb r0, [r1, #0xd5c + OV29_02334DA8_OFFSET] -_02334E34: - ldr r1, [r2] - and r3, r0, #0xff - add r1, r1, r0, lsl #2 - strb r3, [r1, #0x1e0] - ldr r1, [r2] - add r1, r1, r0, lsl #2 - strb r3, [r1, #0x1e1] - ldr r1, [r2] - add r1, r1, r0, lsl #2 - add r0, r0, #1 - strb r3, [r1, #0x1e2] - cmp r0, #0x100 - blt _02334E34 - bx lr - .align 2, 0 -_02334E6C: .word DUNGEON_PTR - arm_func_end ov29_02334DA8 - - arm_func_start ov29_02334E70 -ov29_02334E70: ; 0x02334E70 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - str r0, [sp] - mov r0, #0 - bl GetApparentWeather - bl GetWeatherColorTable - mov r5, r0 - mov r0, #0 - bl GetApparentWeather - ldr r1, [sp] - bl ov29_022E5FE8 - mov r0, #0x25 - bl AdvanceFrame - mov r0, #1 - bl AnimationDelayOrSomething - ldr r0, _0233503C ; =ov29_02353562 - mov r1, #1 - ldrb fp, [r0] - mov r4, #0 - strb r1, [r0] - b _0233500C -_02334EC0: - mov r0, #0x25 - mov r6, #0 - bl AdvanceFrame - mov r8, r6 -_02334ED0: - ldr r0, _02335040 ; =DUNGEON_PTR - ldrb r7, [r5, r8, lsl #2] - ldr sl, [r0] - add r0, sl, r8, lsl #2 - ldrb sb, [r0, #0x1e0] - sub r0, sb, r7 - bl abs - cmp r0, #0xa - addlt r0, sl, r8, lsl #2 - strltb r7, [r0, #0x1e0] - blt _02334F28 - cmp sb, r7 - addlo r1, sl, r8, lsl #2 - ldrlob r0, [r1, #0x1e0] - mov r6, #1 - addlo r0, r0, #0xa - strlob r0, [r1, #0x1e0] - blo _02334F28 - addhi r1, sl, r8, lsl #2 - ldrhib r0, [r1, #0x1e0] - subhi r0, r0, #0xa - strhib r0, [r1, #0x1e0] -_02334F28: - ldr r0, _02335040 ; =DUNGEON_PTR - add r1, r5, r8, lsl #2 - ldr sl, [r0] - ldrb r7, [r1, #1] - add r0, sl, r8, lsl #2 - ldrb sb, [r0, #0x1e1] - sub r0, sb, r7 - bl abs - cmp r0, #0xa - addlt r0, sl, r8, lsl #2 - strltb r7, [r0, #0x1e1] - blt _02334F84 - cmp sb, r7 - addlo r1, sl, r8, lsl #2 - ldrlob r0, [r1, #0x1e1] - mov r6, #1 - addlo r0, r0, #0xa - strlob r0, [r1, #0x1e1] - blo _02334F84 - addhi r1, sl, r8, lsl #2 - ldrhib r0, [r1, #0x1e1] - subhi r0, r0, #0xa - strhib r0, [r1, #0x1e1] -_02334F84: - ldr r0, _02335040 ; =DUNGEON_PTR - add r1, r5, r8, lsl #2 - ldr sl, [r0] - ldrb r7, [r1, #2] - add r0, sl, r8, lsl #2 - ldrb sb, [r0, #0x1e2] - sub r0, sb, r7 - bl abs - cmp r0, #0xa - addlt r0, sl, r8, lsl #2 - strltb r7, [r0, #0x1e2] - blt _02334FE0 - cmp sb, r7 - addlo r1, sl, r8, lsl #2 - ldrlob r0, [r1, #0x1e2] - mov r6, #1 - addlo r0, r0, #0xa - strlob r0, [r1, #0x1e2] - blo _02334FE0 - addhi r1, sl, r8, lsl #2 - ldrhib r0, [r1, #0x1e2] - subhi r0, r0, #0xa - strhib r0, [r1, #0x1e2] -_02334FE0: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 - cmp r8, #0x100 - blt _02334ED0 - bl ov29_022DE608 - cmp r6, #0 - beq _02335014 - add r0, r4, #1 - mov r0, r0, lsl #0x10 - mov r4, r0, asr #0x10 -_0233500C: - cmp r4, #0x40 - blt _02334EC0 -_02335014: - ldr r0, _02335040 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0xc000 -#ifdef JAPAN - ldrb r0, [r0, #0xc94] -#else - ldrb r0, [r0, #0xd38] -#endif - bl ov29_02338A4C - ldr r1, _0233503C ; =ov29_02353562 - ldr r0, [sp] - strb fp, [r1] - bl ov29_02335044 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0233503C: .word ov29_02353562 -_02335040: .word DUNGEON_PTR - arm_func_end ov29_02334E70 - - arm_func_start ov29_02335044 -ov29_02335044: ; 0x02335044 - stmdb sp!, {r4, r5, r6, lr} - ldr r1, _023350D4 ; =DUNGEON_PTR - mov r5, r0 - ldr r0, [r1] - add r0, r0, #0x1a000 -#ifdef JAPAN - ldr r4, [r0, #0x188] -#else - ldr r4, [r0, #0x22c] -#endif - cmp r4, #0 - bne _0233506C - bl GetLeader - mov r4, r0 -_0233506C: - cmp r5, #0 - beq _02335094 - mov r0, #0 - bl GetApparentWeather -#ifdef JAPAN - add r0, r0, #0x56 - add r0, r0, #0xc00 -#else - add r0, r0, #0x45 - add r0, r0, #0xa00 -#endif - mov r1, r0, lsl #0x10 - mov r0, r4 - mov r1, r1, lsr #0x10 - bl LogMessageByIdWithPopupCheckUser -_02335094: - ldr r4, _023350D4 ; =DUNGEON_PTR - mov r5, #0 -_0233509C: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__023350D8 - cmp r0, #0 - beq _023350C4 - mov r0, r6 - bl TryWeatherFormChange -_023350C4: - add r5, r5, #1 - cmp r5, #0x14 - blt _0233509C - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_023350D4: .word DUNGEON_PTR - arm_func_end ov29_02335044 diff --git a/asm/overlay_29_02334D58.s b/asm/overlay_29_02334D58.s new file mode 100644 index 00000000..2869afd8 --- /dev/null +++ b/asm/overlay_29_02334D58.s @@ -0,0 +1,298 @@ + .include "asm/macros.inc" + .include "overlay_29_02334D58.inc" + + .text + + arm_func_start ov29_02334D58 +ov29_02334D58: ; 0x02334D58 + stmdb sp!, {r3, lr} + bl IsSecretFloor + cmp r0, #0 + ldmneia sp!, {r3, pc} + ldr r0, _02334DA4 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x28000 +#ifdef JAPAN + ldrb r0, [r0, #0x612] +#else + ldrb r0, [r0, #0x6b6] +#endif + cmp r0, #8 + bne _02334D8C + mov r0, #8 + bl DungeonRandInt + and r0, r0, #0xff +_02334D8C: + bl ov29_02334DA8 + bl TryActivateArtificialWeatherAbilities + mov r0, #0 + mov r1, #1 + bl TryActivateWeather + ldmia sp!, {r3, pc} + .align 2, 0 +_02334DA4: .word DUNGEON_PTR + arm_func_end ov29_02334D58 + + arm_func_start ov29_02334DA8 +ov29_02334DA8: ; 0x02334DA8 +#ifdef JAPAN +#define OV29_02334DA8_OFFSET -0xA4 +#else +#define OV29_02334DA8_OFFSET 0 +#endif + ldr r3, _02334E6C ; =DUNGEON_PTR + mov r1, #0 + ldr r2, [r3] + add r2, r2, #0xc000 + strb r0, [r2, #0xd39 + OV29_02334DA8_OFFSET] + ldr r0, [r3] + add r0, r0, #0xc000 + ldrb r2, [r0, #0xd39 + OV29_02334DA8_OFFSET] + strb r2, [r0, #0xd38 + OV29_02334DA8_OFFSET] + ldr r0, [r3] + add r0, r0, #0xc000 + strb r1, [r0, #0xd5d + OV29_02334DA8_OFFSET] + mov r0, r1 +_02334DDC: + ldr r2, [r3] + add r2, r2, r1, lsl #1 +#ifdef JAPAN + add r2, r2, #0xcc00 + strh r0, [r2, #0x96] + ldr r2, [r3] + add r2, r2, r1, lsl #1 + add r2, r2, #0xcc00 + add r1, r1, #1 + strh r0, [r2, #0xa6] +#else + add r2, r2, #0xcd00 + strh r0, [r2, #0x3a] + ldr r2, [r3] + add r2, r2, r1, lsl #1 + add r2, r2, #0xcd00 + add r1, r1, #1 + strh r0, [r2, #0x4a] +#endif + cmp r1, #8 + blt _02334DDC + ldr r2, _02334E6C ; =DUNGEON_PTR + mov r3, #9 + ldr r1, [r2] + add r1, r1, #0xc000 + strb r3, [r1, #0xd5a + OV29_02334DA8_OFFSET] + ldr r1, [r2] + add r1, r1, #0xc000 + strb r0, [r1, #0xd5b + OV29_02334DA8_OFFSET] + ldr r1, [r2] + add r1, r1, #0xc000 + strb r0, [r1, #0xd5c + OV29_02334DA8_OFFSET] +_02334E34: + ldr r1, [r2] + and r3, r0, #0xff + add r1, r1, r0, lsl #2 + strb r3, [r1, #0x1e0] + ldr r1, [r2] + add r1, r1, r0, lsl #2 + strb r3, [r1, #0x1e1] + ldr r1, [r2] + add r1, r1, r0, lsl #2 + add r0, r0, #1 + strb r3, [r1, #0x1e2] + cmp r0, #0x100 + blt _02334E34 + bx lr + .align 2, 0 +_02334E6C: .word DUNGEON_PTR + arm_func_end ov29_02334DA8 + + arm_func_start ov29_02334E70 +ov29_02334E70: ; 0x02334E70 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + str r0, [sp] + mov r0, #0 + bl GetApparentWeather + bl GetWeatherColorTable + mov r5, r0 + mov r0, #0 + bl GetApparentWeather + ldr r1, [sp] + bl ov29_022E5FE8 + mov r0, #0x25 + bl AdvanceFrame + mov r0, #1 + bl AnimationDelayOrSomething + ldr r0, _0233503C ; =ov29_02353562 + mov r1, #1 + ldrb fp, [r0] + mov r4, #0 + strb r1, [r0] + b _0233500C +_02334EC0: + mov r0, #0x25 + mov r6, #0 + bl AdvanceFrame + mov r8, r6 +_02334ED0: + ldr r0, _02335040 ; =DUNGEON_PTR + ldrb r7, [r5, r8, lsl #2] + ldr sl, [r0] + add r0, sl, r8, lsl #2 + ldrb sb, [r0, #0x1e0] + sub r0, sb, r7 + bl abs + cmp r0, #0xa + addlt r0, sl, r8, lsl #2 + strltb r7, [r0, #0x1e0] + blt _02334F28 + cmp sb, r7 + addlo r1, sl, r8, lsl #2 + ldrlob r0, [r1, #0x1e0] + mov r6, #1 + addlo r0, r0, #0xa + strlob r0, [r1, #0x1e0] + blo _02334F28 + addhi r1, sl, r8, lsl #2 + ldrhib r0, [r1, #0x1e0] + subhi r0, r0, #0xa + strhib r0, [r1, #0x1e0] +_02334F28: + ldr r0, _02335040 ; =DUNGEON_PTR + add r1, r5, r8, lsl #2 + ldr sl, [r0] + ldrb r7, [r1, #1] + add r0, sl, r8, lsl #2 + ldrb sb, [r0, #0x1e1] + sub r0, sb, r7 + bl abs + cmp r0, #0xa + addlt r0, sl, r8, lsl #2 + strltb r7, [r0, #0x1e1] + blt _02334F84 + cmp sb, r7 + addlo r1, sl, r8, lsl #2 + ldrlob r0, [r1, #0x1e1] + mov r6, #1 + addlo r0, r0, #0xa + strlob r0, [r1, #0x1e1] + blo _02334F84 + addhi r1, sl, r8, lsl #2 + ldrhib r0, [r1, #0x1e1] + subhi r0, r0, #0xa + strhib r0, [r1, #0x1e1] +_02334F84: + ldr r0, _02335040 ; =DUNGEON_PTR + add r1, r5, r8, lsl #2 + ldr sl, [r0] + ldrb r7, [r1, #2] + add r0, sl, r8, lsl #2 + ldrb sb, [r0, #0x1e2] + sub r0, sb, r7 + bl abs + cmp r0, #0xa + addlt r0, sl, r8, lsl #2 + strltb r7, [r0, #0x1e2] + blt _02334FE0 + cmp sb, r7 + addlo r1, sl, r8, lsl #2 + ldrlob r0, [r1, #0x1e2] + mov r6, #1 + addlo r0, r0, #0xa + strlob r0, [r1, #0x1e2] + blo _02334FE0 + addhi r1, sl, r8, lsl #2 + ldrhib r0, [r1, #0x1e2] + subhi r0, r0, #0xa + strhib r0, [r1, #0x1e2] +_02334FE0: + add r0, r8, #1 + mov r0, r0, lsl #0x10 + mov r8, r0, asr #0x10 + cmp r8, #0x100 + blt _02334ED0 + bl ov29_022DE608 + cmp r6, #0 + beq _02335014 + add r0, r4, #1 + mov r0, r0, lsl #0x10 + mov r4, r0, asr #0x10 +_0233500C: + cmp r4, #0x40 + blt _02334EC0 +_02335014: + ldr r0, _02335040 ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0xc000 +#ifdef JAPAN + ldrb r0, [r0, #0xc94] +#else + ldrb r0, [r0, #0xd38] +#endif + bl ov29_02338A4C + ldr r1, _0233503C ; =ov29_02353562 + ldr r0, [sp] + strb fp, [r1] + bl ov29_02335044 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_0233503C: .word ov29_02353562 +_02335040: .word DUNGEON_PTR + arm_func_end ov29_02334E70 + + arm_func_start ov29_02335044 +ov29_02335044: ; 0x02335044 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _023350D4 ; =DUNGEON_PTR + mov r5, r0 + ldr r0, [r1] + add r0, r0, #0x1a000 +#ifdef JAPAN + ldr r4, [r0, #0x188] +#else + ldr r4, [r0, #0x22c] +#endif + cmp r4, #0 + bne _0233506C + bl GetLeader + mov r4, r0 +_0233506C: + cmp r5, #0 + beq _02335094 + mov r0, #0 + bl GetApparentWeather +#ifdef JAPAN + add r0, r0, #0x56 + add r0, r0, #0xc00 +#else + add r0, r0, #0x45 + add r0, r0, #0xa00 +#endif + mov r1, r0, lsl #0x10 + mov r0, r4 + mov r1, r1, lsr #0x10 + bl LogMessageByIdWithPopupCheckUser +_02335094: + ldr r4, _023350D4 ; =DUNGEON_PTR + mov r5, #0 +_0233509C: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r6, [r0, #0xad4] +#else + ldr r6, [r0, #0xb78] +#endif + mov r0, r6 + bl EntityIsValid__023350D8 + cmp r0, #0 + beq _023350C4 + mov r0, r6 + bl TryWeatherFormChange +_023350C4: + add r5, r5, #1 + cmp r5, #0x14 + blt _0233509C + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_023350D4: .word DUNGEON_PTR + arm_func_end ov29_02335044 diff --git a/include/dungeon.h b/include/dungeon.h index e44d04ca..76cad315 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -26,6 +26,29 @@ struct monster_slots { struct entity* wild_pokemon[DUNGEON_MAX_WILD_POKEMON]; }; +struct weather { + enum weather_id weather; // 0x0: current weather + // 0x1: Default weather on the floor that will be reverted to if the current weather is + // artificial and ends + enum weather_id natural_weather; + // 0x2: Turns left for each weather type in enum weather_id (except WEATHER_RANDOM). If + // multiple of these are nonzero, the one with the highest number of turns left is chosen. + // Ties are broken in enum order + u16 weather_turns[8]; + // 0x12: Turns left for artificial permaweather from weather-setting abilities like Drought, + // Sand Stream, Drizzle, and Snow Warning; one counter for each weather type in enum weather_id + // (except WEATHER_RANDOM). Any nonzero value triggers that weather condition (it's usually set + // to 1 or 0). If the weather's source is removed, this value becomes the normal number of turns + // left for that weather condition. Priority in the event of multiple nonzero counters is the + // same as with weather_turns. + u16 artificial_permaweather_turns[8]; + // 0x22: For damaging weather conditions like sandstorm. Counts down from 9-0, damage on 9 + u8 weather_damage_counter; + u8 mud_sport_turns; // 0x23: Number of turns left for the Mud Sport condition + u8 water_sport_turns; // 0x24: Number of turns left for the Water Sport condition + bool8 nullify_weather; // 0x25: Cloud Nine/Air Lock is in effect +}; + // Dungeon state struct dungeon { u8 field_0x0; // 0x0: Initialized to 0x0. @@ -1212,28 +1235,7 @@ struct dungeon { u16 fixed_room_width; // 0xCD36: Height of the generated fixed room? u16 fixed_room_height; - enum weather_id weather; // 0xCD38: current weather - // 0xCD39: Default weather on the floor that will be reverted to if the current weather is - // artificial and ends - enum weather_id natural_weather; - // 0xCD3A: Turns left for each weather type in enum weather_id (except WEATHER_RANDOM). If - // multiple of these are nonzero, the one with the highest number of turns left is chosen. - // Ties are broken in enum order - u16 weather_turns[8]; - // 0xCD4A: Turns left for artificial permaweather from weather-setting abilities like Drought, - // Sand Stream, Drizzle, and Snow Warning; one counter for each weather type in enum weather_id - // (except WEATHER_RANDOM). Any nonzero value triggers that weather condition (it's usually set - // to 1 or 0). If the weather's source is removed, this value becomes the normal number of turns - // left for that weather condition. Priority in the event of multiple nonzero counters is the - // same as with weather_turns. - u16 artificial_permaweather_turns[8]; - // 0xCD5A: For damaging weather conditions like sandstorm. Counts down from 9-0, damage on 9 - u8 weather_damage_counter; - u8 mud_sport_turns; // 0xCD5B: Number of turns left for the Mud Sport condition - u8 water_sport_turns; // 0xCD5C: Number of turns left for the Water Sport condition - bool8 nullify_weather; // 0xCD5D: Cloud Nine/Air Lock is in effect - u8 field_0xcd5e; - u8 field_0xcd5f; + struct weather weather; // 0xCD38 // 0xCD60: Seems to be tile data for tiles within fixed rooms struct tile fixed_room_tiles[8][8]; u8 field_0xd260; diff --git a/include/weather.h b/include/weather.h new file mode 100644 index 00000000..c9d37a5f --- /dev/null +++ b/include/weather.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_WEATHER_H +#define PMDSKY_WEATHER_H + +#include "dungeon_mode.h" + +enum weather_id GetApparentWeather(struct entity *entity); + +#endif //PMDSKY_WEATHER_H diff --git a/main.lsf b/main.lsf index 0b39114e..80f8ab6f 100644 --- a/main.lsf +++ b/main.lsf @@ -495,6 +495,8 @@ Overlay OVY_29 Object asm/overlay_29_02332A0C.o Object src/move_checks.o Object asm/overlay_29_02333FD0.o + Object src/weather.o + Object asm/overlay_29_02334D58.o Object src/overlay_29_023350D8.o Object asm/overlay_29_023350FC.o Object src/dungeon_map_access.o diff --git a/src/move_checks.c b/src/move_checks.c index b825fc03..0c1a50fc 100644 --- a/src/move_checks.c +++ b/src/move_checks.c @@ -223,11 +223,11 @@ bool8 StatusCheckerCheck(struct entity *attacker, struct move *move) break; } case MOVE_MUD_SPORT: - if (DUNGEON_PTR[0]->mud_sport_turns > 0) + if (DUNGEON_PTR[0]->weather.mud_sport_turns > 0) return FALSE; break; case MOVE_WATER_SPORT: - if (DUNGEON_PTR[0]->water_sport_turns > 0) + if (DUNGEON_PTR[0]->weather.water_sport_turns > 0) return FALSE; break; case MOVE_GRUDGE: diff --git a/src/weather.c b/src/weather.c new file mode 100644 index 00000000..83de076c --- /dev/null +++ b/src/weather.c @@ -0,0 +1,22 @@ +#include "weather.h" +#include "dungeon.h" +#include "dungeon_items.h" +#include "dungeon_pokemon_attributes.h" + +extern struct dungeon *DUNGEON_PTR[]; + +enum weather_id GetApparentWeather(struct entity *entity) +{ + if (entity != NULL) + { + bool8 has_weather_band; + if (AbilityIsActiveVeneer(entity, ABILITY_KLUTZ)) + has_weather_band = FALSE; + else + has_weather_band = HasHeldItem(entity, ITEM_WEATHER_BAND); + + if (has_weather_band) + return WEATHER_CLEAR; + } + return DUNGEON_PTR[0]->weather.weather; +}