mirror of
https://github.com/pret/pmd-sky.git
synced 2026-03-21 17:25:15 -05:00
Decomped sub_0205C75C
Decomped by @slaw-22
This commit is contained in:
parent
ed7baf1cd5
commit
a78c571138
|
|
@ -1,79 +1,8 @@
|
|||
.include "asm/macros.inc"
|
||||
.include "main_0205C75C.inc"
|
||||
.include "main_0205C854.inc"
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start sub_0205C75C
|
||||
sub_0205C75C: ; 0x0205C75C
|
||||
stmdb sp!, {r3, r4, r5, lr}
|
||||
ldr r4, _0205C850 ; =MISSION_DELIVER_LIST_PTR
|
||||
mov r5, #0
|
||||
_0205C768:
|
||||
ldr r1, [r4, #0x18]
|
||||
mov r0, r5, lsl #0x18
|
||||
add r0, r1, r0, asr #19
|
||||
bl ClearMissionData
|
||||
add r5, r5, #1
|
||||
cmp r5, #8
|
||||
blt _0205C768
|
||||
ldr r4, _0205C850 ; =MISSION_DELIVER_LIST_PTR
|
||||
mov r5, #0
|
||||
_0205C78C:
|
||||
ldr r1, [r4, #0x18]
|
||||
mov r0, r5, lsl #0x18
|
||||
add r1, r1, #0x100
|
||||
add r0, r1, r0, asr #19
|
||||
bl ClearMissionData
|
||||
add r5, r5, #1
|
||||
cmp r5, #8
|
||||
blt _0205C78C
|
||||
ldr r4, _0205C850 ; =MISSION_DELIVER_LIST_PTR
|
||||
mov r5, #0
|
||||
_0205C7B4:
|
||||
ldr r1, [r4, #0x18]
|
||||
mov r0, r5, lsl #0x18
|
||||
add r1, r1, #0x200
|
||||
add r0, r1, r0, asr #19
|
||||
bl ClearMissionData
|
||||
add r5, r5, #1
|
||||
cmp r5, #8
|
||||
blt _0205C7B4
|
||||
ldr r0, _0205C850 ; =MISSION_DELIVER_LIST_PTR
|
||||
ldr r0, [r0, #0x18]
|
||||
add r0, r0, #0x300
|
||||
bl ClearMissionData
|
||||
ldr r0, _0205C850 ; =MISSION_DELIVER_LIST_PTR
|
||||
ldr r0, [r0, #0x18]
|
||||
add r0, r0, #0x320
|
||||
bl ClearMissionData
|
||||
mov r0, #0
|
||||
ldr r2, _0205C850 ; =MISSION_DELIVER_LIST_PTR
|
||||
mov lr, #0xff
|
||||
mov ip, #1
|
||||
mov r4, r0
|
||||
mov r1, #0xc
|
||||
_0205C80C:
|
||||
mul r5, r0, r1
|
||||
ldr r3, [r2, #0x18]
|
||||
add r0, r0, #1
|
||||
add r3, r3, r5
|
||||
strb lr, [r3, #0x340]
|
||||
ldr r3, [r2, #0x18]
|
||||
cmp r0, #0x10
|
||||
add r3, r3, r5
|
||||
strb ip, [r3, #0x341]
|
||||
ldr r3, [r2, #0x18]
|
||||
add r3, r3, r5
|
||||
str r4, [r3, #0x344]
|
||||
ldr r3, [r2, #0x18]
|
||||
add r3, r3, r5
|
||||
str r4, [r3, #0x348]
|
||||
blt _0205C80C
|
||||
ldmia sp!, {r3, r4, r5, pc}
|
||||
.align 2, 0
|
||||
_0205C850: .word MISSION_DELIVER_LIST_PTR
|
||||
arm_func_end sub_0205C75C
|
||||
|
||||
arm_func_start IsMissionSuspendedAndValid
|
||||
IsMissionSuspendedAndValid: ; 0x0205C854
|
||||
stmdb sp!, {r3, lr}
|
||||
|
|
@ -3,9 +3,10 @@
|
|||
|
||||
#include "direction.h"
|
||||
#include "enums.h"
|
||||
#include "item.h"
|
||||
#include "move.h"
|
||||
#include "graphics.h"
|
||||
#include "item.h"
|
||||
#include "mission.h"
|
||||
#include "move.h"
|
||||
#include "util.h"
|
||||
|
||||
#define NUM_PICKED_IQ_SKILLS 3
|
||||
|
|
|
|||
|
|
@ -2555,40 +2555,6 @@ enum status_blinker_id {
|
|||
STATUS_BLINKER_DROPEYE = 4,
|
||||
};
|
||||
|
||||
// Mission type on a floor
|
||||
enum mission_type {
|
||||
MISSION_RESCUE_CLIENT = 0,
|
||||
MISSION_RESCUE_TARGET = 1,
|
||||
MISSION_ESCORT_TO_TARGET = 2,
|
||||
MISSION_EXPLORE_WITH_CLIENT = 3,
|
||||
MISSION_PROSPECT_WITH_CLIENT = 4,
|
||||
MISSION_GUIDE_CLIENT = 5,
|
||||
MISSION_FIND_ITEM = 6,
|
||||
MISSION_DELIVER_ITEM = 7,
|
||||
MISSION_SEARCH_FOR_TARGET = 8,
|
||||
MISSION_TAKE_ITEM_FROM_OUTLAW = 9,
|
||||
MISSION_ARREST_OUTLAW = 10,
|
||||
MISSION_CHALLENGE_REQUEST = 11,
|
||||
MISSION_TREASURE_MEMO = 12,
|
||||
MISSION_TYPE_UNK_0xD = 13,
|
||||
MISSION_SPECIAL_EPISODE = 14,
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_ARREST_OUTLAW
|
||||
// 0-3 all occur naturally in-game, the distinction is in intensity of the mission.
|
||||
// Each uses a different table of outlaws of varying difficulties.
|
||||
enum mission_subtype_outlaw {
|
||||
MISSION_OUTLAW_NORMAL_0 = 0, // in mission_template, client is magnezone
|
||||
MISSION_OUTLAW_NORMAL_1 = 1, // in mission_template, client is magnezone
|
||||
MISSION_OUTLAW_NORMAL_2 = 2, // in mission_template, client is magnemite
|
||||
MISSION_OUTLAW_NORMAL_3 = 3, // in mission_template, client is magnemite
|
||||
MISSION_OUTLAW_ESCORT = 4,
|
||||
MISSION_OUTLAW_FLEEING = 5,
|
||||
// One of 30 specific pairings (IE: Vespiquen/Combee, Golduck/Psyduck, Cloyster/Clampearl)
|
||||
MISSION_OUTLAW_HIDEOUT = 6,
|
||||
MISSION_OUTLAW_MONSTER_HOUSE = 7,
|
||||
};
|
||||
|
||||
// Fixed room ID. Fixed rooms can be full floor layouts, like most end-of-dungeon boss chambers,
|
||||
// multi-room layouts in the case of Treasure Memos, or single rooms within a larger floor layout
|
||||
// like with key chambers.
|
||||
|
|
|
|||
|
|
@ -2,5 +2,6 @@
|
|||
#define PMDSKY_MAIN_0205C73C_H
|
||||
|
||||
void sub_0205C73C(void);
|
||||
void sub_0205C75C(void);
|
||||
|
||||
#endif //PMDSKY_MAIN_0205C73C_H
|
||||
|
|
|
|||
207
include/mission.h
Normal file
207
include/mission.h
Normal file
|
|
@ -0,0 +1,207 @@
|
|||
#ifndef PMDSKY_MISSION_H
|
||||
#define PMDSKY_MISSION_H
|
||||
|
||||
#include "enums.h"
|
||||
#include "item.h"
|
||||
|
||||
// Represents the different statuses that a mission can have
|
||||
enum mission_status {
|
||||
MISSION_STATUS_INVALID = 0, // Used for empty mission slots
|
||||
MISSION_STATUS_UNK_1 = 1, // The mission won't display a status
|
||||
MISSION_STATUS_UNK_2 = 2, // The mission won't display a status
|
||||
MISSION_STATUS_UNK_3 = 3, // The mission won't display a status
|
||||
MISSION_STATUS_SUSPENDED = 4,
|
||||
MISSION_STATUS_ACCEPTED = 5,
|
||||
MISSION_STATUS_DONE = 6,
|
||||
MISSION_STATUS_UNK_7 = 7, // Shows up as "accepted"
|
||||
MISSION_STATUS_UNK_8 = 8, // Shows up as "accepted"
|
||||
};
|
||||
|
||||
// Different types of rewards that a mission can have
|
||||
enum mission_reward_type {
|
||||
MISSION_REWARD_MONEY = 0,
|
||||
MISSION_REWARD_MONEY_AND_MORE = 1, // Money + (?)
|
||||
MISSION_REWARD_ITEM = 2,
|
||||
MISSION_REWARD_ITEM_AND_MORE = 3, // Item + (?)
|
||||
// Exclusive Item, displayed as "(?)" (Will be 1 star, and beneficial of the client/target)
|
||||
// $SCENARIO_MAIN must be [8, 0] or above AND mission rank must be >=5 stars to be selected.
|
||||
// Also used for the Togetic Wing given from the Gabite Scale mission.
|
||||
MISSION_REWARD_EXCLUSIVE_ITEM = 4,
|
||||
// Money, displayed as "(?)"
|
||||
// $SCENARIO_MAIN must be [12, 0] or above to be selected.
|
||||
MISSION_REWARD_MONEY_HIDDEN = 5,
|
||||
// Either an egg or the client requests to join the team, displayed as "(?)"
|
||||
// $SCENARIO_MAIN must be [6, 0] or above for this to be selected
|
||||
MISSION_REWARD_SPECIAL = 6,
|
||||
};
|
||||
|
||||
// Mission type on a floor
|
||||
enum mission_type {
|
||||
MISSION_RESCUE_CLIENT = 0,
|
||||
MISSION_RESCUE_TARGET = 1,
|
||||
MISSION_ESCORT_TO_TARGET = 2,
|
||||
MISSION_EXPLORE_WITH_CLIENT = 3,
|
||||
MISSION_PROSPECT_WITH_CLIENT = 4,
|
||||
MISSION_GUIDE_CLIENT = 5,
|
||||
MISSION_FIND_ITEM = 6,
|
||||
MISSION_DELIVER_ITEM = 7,
|
||||
MISSION_SEARCH_FOR_TARGET = 8,
|
||||
MISSION_TAKE_ITEM_FROM_OUTLAW = 9,
|
||||
MISSION_ARREST_OUTLAW = 10,
|
||||
MISSION_CHALLENGE_REQUEST = 11,
|
||||
MISSION_TREASURE_MEMO = 12,
|
||||
MISSION_TYPE_UNK_0xD = 13,
|
||||
MISSION_TYPE_CONSUMABLE = 14 // Used for SE3 wondermail and Seven Treasures!
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_RESCUE_TARGET
|
||||
// The distinction is mainly for dialogue
|
||||
enum mission_subtype_rescue_target {
|
||||
// Client and Target are randomly selected
|
||||
MISSION_RESCUE_CLIENT_TARGET_RANDOM = 0,
|
||||
// Client is the evolved form of the target
|
||||
// (IE: Beedrill/Weedle, Aggron/Aron)
|
||||
MISSION_RESCUE_CLIENT_TARGET_CHILD = 1,
|
||||
// Client and Target are deeply similar
|
||||
// (IE: Dodrio/Exeggutor, Muk/Swalot, Magikarp/Feebas)
|
||||
MISSION_RESCUE_CLIENT_TARGET_SIMILAR_FRIENDS = 2,
|
||||
// Client and Target are lovers or rivals
|
||||
// (IE: Nidoking/Nidoqueen, Seviper/Zangoose, Volbeat/Illumise)
|
||||
MISSION_RESCUE_CLIENT_TARGET_LOVERS_RIVALS = 3
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_ESCORT_TO_TARGET
|
||||
enum mission_subtype_escort_to_target {
|
||||
// Client and Target are randomly selected
|
||||
MISSION_ESCORT_CLIENT_TARGET_RANDOM = 0,
|
||||
// Client and Target are counterparts
|
||||
// (IE: Nidoran-M/Nidoran-F, Volbeat/Illumise, Miltank/Tauros)
|
||||
MISSION_ESCORT_CLIENT_TARGET_SPECIFIC = 1
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_EXPLORE_WITH_CLIENT
|
||||
enum mission_subtype_explore {
|
||||
MISSION_EXPLORE_NORMAL = 0,
|
||||
MISSION_EXPLORE_SEALED_CHAMBER = 1,
|
||||
MISSION_EXPLORE_GOLDEN_CHAMBER = 2,
|
||||
MISSION_EXPLORE_NEW_DUNGEON = 3,
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_FIND_ITEM
|
||||
enum mission_subtype_find_item {
|
||||
// In the template, pulls from the "common" table in rescue_item_tables.
|
||||
// Client is random
|
||||
MISSION_FIND_ITEM_COMMON_TABLE = 0,
|
||||
// In the template, pulls from the "rare" table in rescue_item_tables.
|
||||
// Client is random
|
||||
MISSION_FIND_ITEM_RARE_TABLE = 1,
|
||||
// Item is an evolution item for the client
|
||||
// (IE: Gloom/Leaf Stone, Dusclops/Reaper Cloth, Magmar/Magmarizer)
|
||||
MISSION_FIND_ITEM_EVOLVES_CLIENT = 2,
|
||||
// Item is a gummi of one of the client's types
|
||||
// (IE: Flaafy/Yellow Gummi, Baltoy/Brown Gummi, Dratini/Royal Gummi)
|
||||
MISSION_FIND_ITEM_CLIENT_FAVORITE_GUMMI = 3,
|
||||
// This is the special Togetic Mission that unlocks Labyrinth Cave
|
||||
MISSION_TOGETIC_GABITE_SCALE = 4
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_TAKE_ITEM_FROM_OUTLAW
|
||||
// Random Client and Outlaw. NOT Magnezone/Magnemite
|
||||
enum mission_subtype_take_item {
|
||||
MISSION_TAKE_ITEM_NORMAL_OUTLAW = 0,
|
||||
MISSION_TAKE_ITEM_HIDDEN_OUTLAW = 1,
|
||||
MISSION_TAKE_ITEM_FLEEING_OUTLAW = 2,
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_ARREST_OUTLAW
|
||||
// 0-3 all occur naturally in-game, the distinction is in intensity of the mission.
|
||||
// Each uses a different table of outlaws of varying difficulties.
|
||||
enum mission_subtype_outlaw {
|
||||
MISSION_OUTLAW_NORMAL_0 = 0, // in mission_template, client is magnezone
|
||||
MISSION_OUTLAW_NORMAL_1 = 1, // in mission_template, client is magnezone
|
||||
MISSION_OUTLAW_NORMAL_2 = 2, // in mission_template, client is magnemite
|
||||
MISSION_OUTLAW_NORMAL_3 = 3, // in mission_template, client is magnemite
|
||||
MISSION_OUTLAW_ESCORT = 4,
|
||||
MISSION_OUTLAW_FLEEING = 5,
|
||||
// One of 30 specific pairings (IE: Vespiquen/Combee, Golduck/Psyduck, Cloyster/Clampearl)
|
||||
MISSION_OUTLAW_HIDEOUT = 6,
|
||||
MISSION_OUTLAW_MONSTER_HOUSE = 7,
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_CHALLENGE_REQUEST
|
||||
enum mission_subtype_challenge {
|
||||
// One of 28 specific pairings
|
||||
// (IE: Charizard/Blastoise/Venusaur, Hitmontop/Hitmonchan/HitmonLee,
|
||||
// Nidoking/Nidorina/Nidorino)
|
||||
MISSION_CHALLENGE_NORMAL = 0,
|
||||
MISSION_CHALLENGE_MEWTWO = 1,
|
||||
MISSION_CHALLENGE_ENTEI = 2,
|
||||
MISSION_CHALLENGE_RAIKOU = 3,
|
||||
MISSION_CHALLENGE_SUICUNE = 4,
|
||||
MISSION_CHALLENGE_JIRACHI = 5,
|
||||
};
|
||||
|
||||
// Mission subtype for MISSION_TYPE_CONSUMABLE
|
||||
enum mission_subtype_consumable {
|
||||
MISSION_CONSUMABLE_UNK_0 = 0,
|
||||
// Subtype 0x1 is used in the template for seven-treasure missions
|
||||
MISSION_SEVEN_TREASURE = 1,
|
||||
// Subtype 0x2 is used by the SE3 wondermail
|
||||
MISSION_SPECIAL_EPISODE = 2
|
||||
};
|
||||
|
||||
// The meaning of the mission subtype depends on the mission type
|
||||
union mission_subtype {
|
||||
enum mission_subtype_rescue_target rescue_target;
|
||||
enum mission_subtype_escort_to_target escort;
|
||||
enum mission_subtype_explore explore;
|
||||
enum mission_subtype_find_item find_item;
|
||||
enum mission_subtype_take_item take_item;
|
||||
enum mission_subtype_outlaw outlaw;
|
||||
enum mission_subtype_challenge challenge;
|
||||
enum mission_subtype_consumable consumable;
|
||||
u8 other;
|
||||
};
|
||||
|
||||
// Different types of restrictions that a mission can have
|
||||
enum mission_restriction_type {
|
||||
MISSION_RESTRICTION_NONE = 0,
|
||||
MISSION_RESTRICTION_TYPE = 1, // Requires a pokémon of a certain type on the team
|
||||
MISSION_RESTRICTION_MONSTER = 2, // Requires a certain pokémon on the team
|
||||
};
|
||||
|
||||
// The restriction of a mission can be a monster ID or a type ID
|
||||
union mission_restriction {
|
||||
enum monster_id monster_id;
|
||||
enum type_id type_id;
|
||||
};
|
||||
|
||||
// Contains the data for a single mission
|
||||
struct mission {
|
||||
enum mission_status status; // 0x0
|
||||
enum mission_type type; // 0x1
|
||||
union mission_subtype subtype; // 0x2
|
||||
enum dungeon_id dungeon_id; // 0x4
|
||||
u8 floor; // 0x5
|
||||
// 0x8: A random value determined by FUN_0205146C [EU], which is used to
|
||||
// randomly generate the mission title and description.
|
||||
s32 description_id;
|
||||
u8 unique_map_id; // 0xC: for challenges/treasure hunts/certain outlaws
|
||||
enum monster_id client; // 0xE: For challenge letter missions, stores the leader
|
||||
// 0x10: For non-legendary challenge letter missions, stores the second team member
|
||||
enum monster_id target;
|
||||
// 0x12: For non-legendary challenge letter missions, stores the third team member
|
||||
enum monster_id outlaw_backup_species;
|
||||
enum item_id item_wanted; // 0x14
|
||||
enum mission_reward_type reward_type; // 0x16
|
||||
enum item_id item_reward; // 0x18
|
||||
enum mission_restriction_type restriction_type; // 0x1A
|
||||
union mission_restriction restriction; // 0x1C
|
||||
};
|
||||
|
||||
struct mission_deliver_list {
|
||||
u8 unk0[0x18];
|
||||
u8* unk18;
|
||||
};
|
||||
|
||||
#endif //PMDSKY_MISSION_H
|
||||
2
main.lsf
2
main.lsf
|
|
@ -162,7 +162,7 @@ Static main
|
|||
Object src/main_0205C440.o
|
||||
Object asm/main_0205C548.o
|
||||
Object src/main_0205C73C.o
|
||||
Object asm/main_0205C75C.o
|
||||
Object asm/main_0205C854.o
|
||||
Object src/dungeon_init_2.o
|
||||
Object asm/main_0206A750.o
|
||||
Object src/main_0206C98C.o
|
||||
|
|
|
|||
|
|
@ -1,12 +1,43 @@
|
|||
#include "main_0205C73C.h"
|
||||
#include "mission.h"
|
||||
|
||||
extern u32 MISSION_DELIVER_LIST_PTR[];
|
||||
extern struct mission_deliver_list MISSION_DELIVER_LIST_PTR;
|
||||
extern u8 _022B6F10[];
|
||||
|
||||
extern void sub_020600CC(void);
|
||||
extern void ClearMissionData(struct mission* mission);
|
||||
|
||||
void sub_0205C73C(void)
|
||||
{
|
||||
MISSION_DELIVER_LIST_PTR[6] = (u32)_022B6F10;
|
||||
MISSION_DELIVER_LIST_PTR.unk18 = _022B6F10;
|
||||
sub_020600CC();
|
||||
}
|
||||
|
||||
void sub_0205C75C(void)
|
||||
{
|
||||
for (s32 i = 0; i < 8; i++)
|
||||
{
|
||||
ClearMissionData((struct mission*) (MISSION_DELIVER_LIST_PTR.unk18 + (s32)(s8)i * 32));
|
||||
}
|
||||
|
||||
for (s32 i = 0; i < 8; i++)
|
||||
{
|
||||
ClearMissionData((struct mission*) (MISSION_DELIVER_LIST_PTR.unk18 + 0x100 + (s32)(s8)i * 32));
|
||||
}
|
||||
|
||||
for (s32 i = 0; i < 8; i++)
|
||||
{
|
||||
ClearMissionData((struct mission*) (MISSION_DELIVER_LIST_PTR.unk18 + 0x200 + (s32)(s8)i * 32));
|
||||
}
|
||||
|
||||
ClearMissionData((struct mission*) (MISSION_DELIVER_LIST_PTR.unk18 + 0x300));
|
||||
ClearMissionData((struct mission*) (MISSION_DELIVER_LIST_PTR.unk18 + 0x320));
|
||||
|
||||
for (s32 i = 0; i < 16; i++)
|
||||
{
|
||||
MISSION_DELIVER_LIST_PTR.unk18[i * 12 + 0x340] = 0xFF;
|
||||
MISSION_DELIVER_LIST_PTR.unk18[i * 12 + 0x341] = 1;
|
||||
*(u32 *)&MISSION_DELIVER_LIST_PTR.unk18[i * 12 + 0x344] = 0;
|
||||
*(u32 *)&MISSION_DELIVER_LIST_PTR.unk18[i * 12 + 0x348] = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user