summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcamthesaxman <cameronghall@cox.net>2018-01-06 12:28:12 -0600
committercamthesaxman <cameronghall@cox.net>2018-01-06 12:28:12 -0600
commit680d3fd7b980578024226eccffe2e01072826227 (patch)
tree45bd58a6df683e25685a2a6bd9ff2d4c5116dcf5 /src
parentb3551bc2f328c286c6ecc45ea288665d46b44260 (diff)
parent7bf330e9f2b048a9b3d7882c80c9aa413c55484a (diff)
Merge branch 'master' of https://github.com/pret/pokeruby
Diffstat (limited to 'src')
-rw-r--r--src/engine/cable_car_util.c47
-rw-r--r--src/field/field_weather.c1
-rw-r--r--src/scene/cable_car.c979
3 files changed, 1027 insertions, 0 deletions
diff --git a/src/engine/cable_car_util.c b/src/engine/cable_car_util.c
new file mode 100644
index 000000000..02bfbc195
--- /dev/null
+++ b/src/engine/cable_car_util.c
@@ -0,0 +1,47 @@
+#include "global.h"
+#include "cable_car_util.h"
+
+// static types
+
+// static declarations
+
+// rodata
+
+// text
+
+void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i;
+ u8 j;
+ u8 x;
+ u8 y;
+
+ for (i = 0, y = top; i < height; i++)
+ {
+ for (x = left, j = 0; j < width; j++)
+ {
+ *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value;
+ x = (x + 1) % 32;
+ }
+ y = (y + 1) % 32;
+ }
+}
+
+void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i;
+ u8 j;
+ u8 x;
+ u8 y;
+ const u16 *_src;
+
+ for (i = 0, _src = src, y = top; i < height; i++)
+ {
+ for (x = left, j = 0; j < width; j++)
+ {
+ *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++;
+ x = (x + 1) % 32;
+ }
+ y = (y + 1) % 32;
+ }
+}
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index 4a819bddf..c954242a1 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -46,6 +46,7 @@ const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz");
const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz");
const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz");
const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz");
+
extern u8 (*gUnknown_0202FC48)[32];
extern u8 gUnknown_0202F9E8[32];
diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c
new file mode 100644
index 000000000..52a0aeebf
--- /dev/null
+++ b/src/scene/cable_car.c
@@ -0,0 +1,979 @@
+
+// Includes
+#include "global.h"
+#include "ewram.h"
+#include "overworld.h"
+#include "palette.h"
+#include "random.h"
+#include "main.h"
+#include "script.h"
+#include "task.h"
+#include "sound.h"
+#include "graphics.h"
+#include "constants/songs.h"
+#include "decompress.h"
+#include "field_weather.h"
+#include "field_map_obj.h"
+#include "unknown_task.h"
+#include "event_data.h"
+#include "cable_car_util.h"
+#include "constants/map_objects.h"
+
+// Static type declarations
+
+// Credits to Made (dolphin emoji)
+#define S16TOPOSFLOAT(val) \
+({ \
+ s16 v = (val); \
+ float f = (float)v; \
+ if(v < 0) f += 65536.0f; \
+ f; \
+})
+
+struct CableCarEwramStruct1 {
+ u8 unk_0000;
+ u8 unk_0001;
+ u8 unk_0002;
+ u8 unk_0003;
+ u16 unk_0004;
+ u16 unk_0006;
+ u8 unk_0008;
+ u8 unk_0009;
+ u8 filler_000a[2];
+ u8 unk_000c;
+ u8 unk_000d;
+ u8 filler_0000e[6];
+ u8 unk_0014;
+ u8 unk_0015;
+ u8 unk_0016;
+ u8 unk_0017;
+ u8 unk_0018;
+ u8 unk_0019;
+ u8 unk_001a;
+ u8 unk_001b;
+ u8 unk_001c;
+ u8 unk_001d;
+ u8 unk_001e;
+ u8 unk_001f;
+ u8 unk_0020;
+ u16 unk_0022[9][12];
+ u8 filler_00fa[2];
+ u16 unk_00fc[0x20][0x20];
+ u16 unk_08fc[0x20][0x20];
+}; // size 0x10FC
+
+struct CableCarEwramStruct2 {
+ /* 0x000 */ u16 mtChimneyTilemap[0xb4];
+ /* 0x168 */ u16 treeTilemap[0x1e0];
+ /* 0x528 */ u16 mountainTilemap[0x258];
+ /* 0x9d8 */ u16 pylonStemTilemap[0x628]; // size not actually known
+};
+
+// Static RAM declarations
+
+EWRAM_DATA struct CableCarEwramStruct1 *sCableCarPtr = NULL;
+EWRAM_DATA u8 gUnknown_02039278 = 0;
+EWRAM_DATA u8 gUnknown_02039279 = 0;
+EWRAM_DATA u8 gUnknown_0203927A = 0;
+EWRAM_DATA u8 gUnknown_0203927B = 0;
+EWRAM_DATA u8 gUnknown_0203927C = 0;
+EWRAM_DATA u8 gUnknown_0203927D = 0;
+EWRAM_DATA u32 filler_02039280 = 0;
+
+// Static ROM declarations
+
+static void CableCarMainCallback_Setup(void);
+static void CableCarMainCallback_Run(void);
+static void sub_8123878(u8 taskId);
+static void sub_81239E4(u8 taskId);
+static void sub_8123AF8(u8 taskId);
+static void CableCarVblankCallback(void);
+static void nullsub_76(struct Sprite *sprite);
+static void sub_8123CB8(struct Sprite *sprite);
+static void sub_8123EB8(struct Sprite *sprite);
+static void sub_8123F44(struct Sprite *sprite);
+static void sub_8123FBC(u8);
+static void LoadSprites(void);
+static void sub_812453C(void);
+static void sub_8124598(void);
+static void sub_81245F4(void);
+static void sub_812476C(void);
+static void sub_81248AC(u8);
+
+// .rodata
+
+static const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz");
+
+static const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz");
+
+static const u8 gCableCarMountainTilemap[] = INCBIN_U8("graphics/misc/cable_car_mountain_map.bin.lz");
+
+static const u16 gCableCarPylonHookTilemapEntries[] = {
+ 0x3000,
+ 0x3001,
+ 0x3002,
+ 0x3003,
+ 0x3004,
+ 0x3005,
+ 0x3006,
+ 0x3007,
+ 0x3008,
+ 0x3009
+};
+
+static const u8 gCableCarPylonStemTilemap[] = INCBIN_U8("graphics/misc/cable_car_pylon_stem_map.bin.lz");
+
+static const struct CompressedSpriteSheet gUnknown_08401CF8[] = {
+ { gCableCar_Gfx, 0x800, 1 },
+ { gCableCarDoor_Gfx, 0x40, 2 },
+ { gCableCarCord_Gfx, 0x80, 3 },
+ { }
+};
+static const struct SpritePalette gUnknown_08401D18[] = {
+ { gCableCar_Pal, 1 },
+ { }
+};
+
+static const struct OamData gOamData_8401D28 = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .size = 3,
+ .priority = 2
+};
+
+static const struct OamData gOamData_8401D30 = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .shape = ST_OAM_H_RECTANGLE,
+ .priority = 2
+};
+
+static const struct OamData gOamData_8401D38 = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .size = 1,
+ .priority = 2
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8401D40[] = {
+ {
+ 1,
+ 1,
+ &gOamData_8401D28,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_8123CB8
+ }, {
+ 2,
+ 1,
+ &gOamData_8401D30,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_8123CB8
+ }, {
+ 3,
+ 1,
+ &gOamData_8401D38,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ nullsub_76
+ }
+};
+
+// .text
+
+static void CableCarTask1(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CableCarMainCallback_Setup);
+ DestroyTask(taskId);
+ }
+}
+
+void CableCar(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(CableCarTask1, 1);
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+}
+
+static void CableCarMainCallback_Setup(void)
+{
+ u8 i;
+ u16 imebak;
+
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ SetVBlankCallback(NULL);
+ remove_some_task();
+ DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000);
+ DmaFill32Defvars(3, 0, OAM, OAM_SIZE);
+ DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE);
+ sCableCarPtr = eCableCar1;
+ DmaFill16Large(3, 0, eCableCar1, 0x10FC, 0x1000);
+ gMain.state++;
+ break;
+ case 1:
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ StartWeather();
+ for (i = 0; i < 20; i++)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
+ }
+ InitMapMusic();
+ ResetMapMusic();
+ gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0;
+ gMain.state++;
+ break;
+ case 2:
+ for (i = 0; i < 3; i++)
+ {
+ LoadCompressedObjectPic(&gUnknown_08401CF8[i]);
+ }
+ LoadSpritePalettes(gUnknown_08401D18);
+ LZDecompressWram(gCableCarMtChimneyTilemap, eCableCar2->mtChimneyTilemap);
+ LZDecompressWram(gCableCarTreeTilemap, eCableCar2->treeTilemap);
+ LZDecompressWram(gCableCarMountainTilemap, eCableCar2->mountainTilemap);
+ LZDecompressWram(gCableCarPylonStemTilemap, eCableCar2->pylonStemTilemap);
+ LoadPalette(gCableCarBG_Pal, 0, 0x80);
+ LZ77UnCompVram(gCableCarBG_Gfx, (u16 *)BG_VRAM);
+ gMain.state++;
+ break;
+ case 3:
+ LoadSprites();
+ RunTasks();
+ gMain.state++;
+ break;
+ case 4:
+ if (sCableCarPtr->unk_0002 == 7)
+ {
+ gMain.state++;
+ }
+ else if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0;
+ }
+ }
+ gMain.state++;
+ }
+ break;
+ case 5:
+ CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(29), eCableCar2->treeTilemap, 0, 17, 32, 15);
+ CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(30), eCableCar2->mountainTilemap, 0, 0, 30, 20);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 20);
+ gMain.state++;
+ break;
+ case 6:
+ sub_81248AC(gSpecialVar_0x8004);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x48, 0, 14, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x6C, 12, 17, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x90, 24, 20, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 0, 17, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0, 20, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 12, 20, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 12, 23, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 24, 23, 12, 3);
+ gMain.state++;
+ break;
+ case 7:
+ BeginNormalPaletteFade(-1, 3, 16, 0, 0);
+ FadeInNewBGM(BGM_ROPEWAY, 1);
+ sub_8123FBC(1);
+ gMain.state++;
+ break;
+ case 8:
+ imebak = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = imebak;
+ SetVBlankCallback(CableCarVblankCallback);
+ SetMainCallback2(CableCarMainCallback_Run);
+ CreateTask(sub_8123878, 0);
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sCableCarPtr->unk_0000 = CreateTask(sub_81239E4, 1);
+ }
+ else
+ {
+ sCableCarPtr->unk_0000 = CreateTask(sub_8123AF8, 1);
+ }
+ break;
+ }
+}
+
+static void CableCarMainCallback_Run(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ MapMusicMain();
+}
+
+static void sub_8123740(void)
+{
+ u8 i;
+
+ i = 0;
+ sub_8123FBC(0);
+ gSpriteCoordOffsetX = 0;
+ sub_807C9B4(0);
+ for (; i < 20; i++)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
+ }
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ DmaFill32Large(3, 0, gSharedMem, 0x20000, 0x1000);
+ sCableCarPtr = NULL;
+ DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000);
+ DmaFill32Defvars(3, 0, OAM, OAM_SIZE);
+ DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE);
+ warp_in();
+ gFieldCallback = NULL;
+ SetMainCallback2(CB2_LoadMap);
+}
+
+static void sub_8123878(u8 taskId)
+{
+ u8 i;
+
+ i = 0;
+ sCableCarPtr->unk_0006++;
+ switch (sCableCarPtr->unk_0001)
+ {
+ case 0:
+ if (sCableCarPtr->unk_0006 == sCableCarPtr->unk_0004)
+ {
+ DoWeatherEffect(sCableCarPtr->unk_0002);
+ sCableCarPtr->unk_0001 = 1;
+ }
+ break;
+ case 1:
+ switch (sCableCarPtr->unk_0002)
+ {
+ case 7:
+ if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL && gWeatherPtr->sprites.s2.ashSprites[0]->oam.priority != 0)
+ {
+ for (; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0;
+ }
+ }
+ sCableCarPtr->unk_0001 = 2;
+ }
+ break;
+ case 2:
+ if (gWeatherPtr->currWeather == 2)
+ {
+ sCableCarPtr->unk_0001 = 2;
+ }
+ else if (sCableCarPtr->unk_0006 >= sCableCarPtr->unk_0004 + 8)
+ {
+ for (; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i]->invisible ^= TRUE;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ case 2:
+ if (sCableCarPtr->unk_0006 == 570)
+ {
+ sCableCarPtr->unk_0001 = 3;
+ BeginNormalPaletteFade(-1, 3, 0, 16, 0);
+ FadeOutBGM(4);
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ sCableCarPtr->unk_0001 = 255;
+ }
+ break;
+ case 255:
+ SetVBlankCallback(NULL);
+ DestroyTask(taskId);
+ DestroyTask(sCableCarPtr->unk_0000);
+ SetMainCallback2(sub_8123740);
+ break;
+ }
+}
+
+static void sub_81239E4(u8 taskId)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ sCableCarPtr->unk_0014--;
+ if ((sCableCarPtr->unk_0006 % 2) == 0)
+ {
+ sCableCarPtr->unk_0015--;
+ }
+ if ((sCableCarPtr->unk_0006 % 8) == 0)
+ {
+ sCableCarPtr->unk_000c--;
+ sCableCarPtr->unk_000d--;
+ }
+ switch (sCableCarPtr->unk_0014)
+ {
+ case 175:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10);
+ break;
+ case 40:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 3, 0, 2, 2);
+ break;
+ case 32:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 1, 2);
+ break;
+ case 16:
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30);
+ sCableCarPtr->unk_0015 = 64;
+ break;
+ }
+ }
+ sub_812453C();
+ gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128;
+}
+
+static void sub_8123AF8(u8 taskId)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ sCableCarPtr->unk_0014++;
+ if ((sCableCarPtr->unk_0006 % 2) == 0)
+ {
+ sCableCarPtr->unk_0015++;
+ }
+ if ((sCableCarPtr->unk_0006 % 8) == 0)
+ {
+ sCableCarPtr->unk_000c++;
+ sCableCarPtr->unk_000d++;
+ }
+ switch (sCableCarPtr->unk_0014)
+ {
+ case 176:
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30);
+ break;
+ case 16:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 3, 2);
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10);
+ sCableCarPtr->unk_0015 = 192;
+ break;
+ case 32:
+ sCableCarPtr->unk_08fc[0][2] = (gCableCarPylonHookTilemapEntries + 2)[0];
+ sCableCarPtr->unk_08fc[0][3] = (gCableCarPylonHookTilemapEntries + 2)[1];
+ sCableCarPtr->unk_08fc[1][2] = (gCableCarPylonHookTilemapEntries + 2)[5];
+ sCableCarPtr->unk_08fc[1][3] = (gCableCarPylonHookTilemapEntries + 2)[6];
+ break;
+ case 40:
+ sCableCarPtr->unk_08fc[0][4] = (gCableCarPylonHookTilemapEntries + 4)[0];
+ sCableCarPtr->unk_08fc[1][4] = (gCableCarPylonHookTilemapEntries + 4)[5];
+ break;
+ }
+ }
+ sub_8124598();
+ if (sCableCarPtr->unk_0006 < sCableCarPtr->unk_0004) {
+ gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6FC = (gWeatherPtr->unknown_6FC + 247) % 248;
+ }
+}
+
+static void CableCarVblankCallback(void)
+{
+ DmaCopy16(3, sCableCarPtr->unk_00fc, BG_SCREEN_ADDR(28), 0x800);
+ DmaCopy16(3, sCableCarPtr->unk_08fc, BG_SCREEN_ADDR(31), 0x800);
+ REG_BG3HOFS = sCableCarPtr->unk_0014;
+ REG_BG3VOFS = sCableCarPtr->unk_0015;
+ REG_BG1HOFS = sCableCarPtr->unk_000c;
+ REG_BG1VOFS = sCableCarPtr->unk_000d;
+ REG_BG0HOFS = sCableCarPtr->unk_0008;
+ REG_BG0VOFS = sCableCarPtr->unk_0009;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void nullsub_76(struct Sprite *sprite)
+{
+
+}
+
+static void sub_8123CB8(struct Sprite *sprite)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ else
+ {
+ sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ }
+}
+
+static void sub_8123D98(struct Sprite *sprite)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ else
+ {
+ sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->pos2.y = 17;
+ if (sprite->data[3] ++ > 9)
+ {
+ sprite->data[3] = 0;
+ sprite->data[2] ++;
+ }
+ break;
+ default:
+ sprite->pos2.y = 16;
+ if (sprite->data[3] ++ > 9)
+ {
+ sprite->data[3] = 0;
+ sprite->data[2] = 0;
+ }
+ break;
+ }
+ }
+}
+
+static void sub_8123EB8(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x += 2 * sprite->centerToCornerVecX;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ }
+ if (++sprite->data[0] >= sprite->data[2])
+ {
+ switch (sprite->data[1])
+ {
+ case 0:
+ sprite->pos1.x++;
+ if ((sprite->data[0] % 4) == 0)
+ {
+ sprite->pos1.y++;
+ }
+ break;
+ case 1:
+ if ((sprite->data[0] % 2) != 0)
+ {
+ sprite->pos1.x++;
+ if ((sprite->pos1.x % 4) == 0)
+ {
+ sprite->pos1.y++;
+ }
+ }
+ break;
+ }
+ if (sprite->pos1.y > 0xa0)
+ {
+ DestroySprite(sprite);
+ }
+ }
+}
+
+static void sub_8123F44(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ }
+ if (++sprite->data[0] >= sprite->data[2])
+ {
+ switch (sprite->data[1])
+ {
+ case 0:
+ sprite->pos1.x--;
+ if ((sprite->data[0] % 4) == 0)
+ {
+ sprite->pos1.y--;
+ }
+ break;
+ case 1:
+ if ((sprite->data[0] % 2) != 0)
+ {
+ sprite->pos1.x--;
+ if ((sprite->pos1.x % 4) == 0)
+ {
+ sprite->pos1.y--;
+ }
+ }
+ break;
+ }
+ if (sprite->pos1.y < 0x50)
+ {
+ DestroySprite(sprite);
+ }
+ }
+}
+
+static void sub_8123FBC(bool8 which)
+{
+ switch (which)
+ {
+ case FALSE:
+ default:
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ REG_WIN0H = 0;
+ REG_WIN1H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1V = 0;
+ REG_DISPCNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BLDCNT = 0;
+ break;
+ case TRUE:
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ REG_WIN0H = 0;
+ REG_WIN1H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1V = 0;
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sCableCarPtr->unk_0014 = 0xb0;
+ sCableCarPtr->unk_0015 = 0x10;
+ sCableCarPtr->unk_000c = 0x00;
+ sCableCarPtr->unk_000d = 0x50;
+ sCableCarPtr->unk_0009 = 0;
+ sCableCarPtr->unk_0009 = 0;
+ }
+ else
+ {
+ sCableCarPtr->unk_0014 = 0x60;
+ sCableCarPtr->unk_0015 = 0xe8;
+ sCableCarPtr->unk_000c = 0x00;
+ sCableCarPtr->unk_000d = 0x04;
+ sCableCarPtr->unk_0009 = 0;
+ sCableCarPtr->unk_0009 = 0;
+ }
+ REG_BG3HOFS = sCableCarPtr->unk_0014;
+ REG_BG3VOFS = sCableCarPtr->unk_0015;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = sCableCarPtr->unk_000c;
+ REG_BG1VOFS = sCableCarPtr->unk_000d;
+ REG_BG0HOFS = sCableCarPtr->unk_0008;
+ REG_BG0VOFS = sCableCarPtr->unk_0009;
+ REG_BG0CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_WRAP;
+ REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29) | BGCNT_WRAP;
+ REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(30) | BGCNT_WRAP;
+ REG_BG3CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_WRAP;
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+ REG_BLDCNT = 0x3f00;
+ break;
+ }
+}
+
+static void LoadSprites(void)
+{
+ u8 spriteId;
+ u8 i;
+
+ u8 playerGraphicsIds[2] = {
+ MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL,
+ MAP_OBJ_GFX_RIVAL_MAY_NORMAL
+ };
+ u16 rval = Random();
+ u8 hikerGraphicsIds[4] = {
+ MAP_OBJ_GFX_HIKER,
+ MAP_OBJ_GFX_CAMPER,
+ MAP_OBJ_GFX_PICNICKER,
+ MAP_OBJ_GFX_POOCHYENA
+ };
+ s16 hikerCoords[2][2] = {
+ { 0, 80 },
+ { 240, 146 }
+ };
+ u8 hikerMovementDelayTable[4] = {
+ 0,
+ 60,
+ 120,
+ 170
+ };
+ void (*callbacks[2])(struct Sprite *) = {
+ sub_8123EB8,
+ sub_8123F44
+ };
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 0:
+ default:
+ spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0xc8, 0x49, 0x66);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].pos2.x = 0x08;
+ gSprites[spriteId].pos2.y = 0x10;
+ gSprites[spriteId].data[0] = 0xc8;
+ gSprites[spriteId].data[1] = 0x49;
+ }
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0xb0, 0x2b, 0x67);
+ gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20;
+ gSprites[spriteId].data[0] = 0xb0;
+ gSprites[spriteId].data[1] = 0x2b;
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0xc8, 0x63, 0x65);
+ gSprites[spriteId].pos2.x = 8;
+ gSprites[spriteId].pos2.y = 4;
+ gSprites[spriteId].data[0] = 0xc8;
+ gSprites[spriteId].data[1] = 0x63;
+ sCableCarPtr->unk_0002 = 7;
+ sCableCarPtr->unk_0004 = 0x15e;
+ sub_807C9B4(2);
+ break;
+ case 1:
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03);
+ spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0x80, 0x27, 0x66);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].pos2.x = 0x08;
+ gSprites[spriteId].pos2.y = 0x10;
+ gSprites[spriteId].data[0] = 0x80;
+ gSprites[spriteId].data[1] = 0x27;
+ }
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0x68, 0x09, 0x67);
+ gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20;
+ gSprites[spriteId].data[0] = 0x68;
+ gSprites[spriteId].data[1] = 0x09;
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0x80, 0x41, 0x65);
+ gSprites[spriteId].pos2.x = 8;
+ gSprites[spriteId].pos2.y = 4;
+ gSprites[spriteId].data[0] = 0x80;
+ gSprites[spriteId].data[1] = 0x41;
+ sCableCarPtr->unk_0002 = 2;
+ sCableCarPtr->unk_0004 = 0x109;
+ sub_807C9B4(7);
+ break;
+ }
+ for (i = 0; i < 9; i++)
+ {
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[2], 16 * i + 0x60, 8 * i - 8, 0x68);
+ gSprites[spriteId].pos2.x = 8;
+ gSprites[spriteId].pos2.y = 8;
+ }
+ if ((rval % 64) == 0)
+ {
+ spriteId = AddPseudoFieldObject(hikerGraphicsIds[rval % 3], callbacks[gSpecialVar_0x8004], hikerCoords[gSpecialVar_0x8004][0], hikerCoords[gSpecialVar_0x8004][1], 0x6a);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].centerToCornerVecX;
+ gSprites[spriteId].pos2.y = -gSprites[spriteId].centerToCornerVecY;
+ if (gSpecialVar_0x8004 == 0)
+ {
+ if (rval % 2)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 6);
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].pos1.y += 2;
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[spriteId], 7);
+ gSprites[spriteId].data[1] = 0;
+ }
+ }
+ else
+ {
+ if (rval % 2)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 7);
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].pos1.y += 2;
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[spriteId], 6);
+ gSprites[spriteId].data[1] = 0;
+ }
+ }
+ gSprites[spriteId].data[2] = hikerMovementDelayTable[rval % 4];
+ }
+ }
+}
+
+static void sub_812446C(void)
+{
+ u8 i;
+ u8 j;
+ u8 k;
+ u8 offset;
+
+ for (i = 0, k = 0, offset = 0x24 * (sCableCarPtr->unk_001b + 2); i < 3; i++)
+ {
+ for (j = 0; j < 12; j++)
+ {
+ sCableCarPtr->unk_0022[i][j] = *(eCableCar2->mtChimneyTilemap + (offset++));
+ sCableCarPtr->unk_0022[i + 3][j] = eCableCar2->mtChimneyTilemap[k];
+ sCableCarPtr->unk_0022[i + 6][j] = (eCableCar2->mtChimneyTilemap + 0x24)[k];
+ k++;
+ }
+ }
+ sCableCarPtr->unk_001b = (sCableCarPtr->unk_001b + 1) % 3;
+}
+
+static void sub_812453C(void)
+{
+ sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60;
+ sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f - sCableCarPtr->unk_001d;
+ sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 - sCableCarPtr->unk_001e;
+ sCableCarPtr->unk_001d++;
+ if ((sCableCarPtr->unk_001d % 4) == 0)
+ {
+ sCableCarPtr->unk_001e++;
+ }
+ if (sCableCarPtr->unk_001d > 16)
+ {
+ sub_81245F4();
+ }
+}
+
+static void sub_8124598(void)
+{
+ sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60;
+ sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f + sCableCarPtr->unk_001d;
+ sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 + sCableCarPtr->unk_001e;
+ sCableCarPtr->unk_001d++;
+ if ((sCableCarPtr->unk_001d % 4) == 0)
+ {
+ sCableCarPtr->unk_001e++;
+ }
+ if (sCableCarPtr->unk_001d > 16)
+ {
+ sub_812476C();
+ }
+}
+
+static void sub_81245F4(void)
+{
+ u8 i = 0;
+
+ sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0;
+ sCableCarPtr->unk_001f = sCableCarPtr->unk_0008;
+ sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009;
+ sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 30) % 32;
+ sCableCarPtr->unk_0018 -= 2;
+ gUnknown_0203927A = (sCableCarPtr->unk_001a + 23) % 32;
+ for (i = 0; i < 9; i++)
+ {
+ gUnknown_02039278 = sCableCarPtr->unk_0019;
+ gUnknown_02039279 = (gUnknown_0203927A + i) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018];
+ gUnknown_02039278 = (gUnknown_02039278 + 1) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1];
+ }
+ gUnknown_02039278 = (sCableCarPtr->unk_0019 + 30) % 32;
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, gUnknown_02039278, 0, 2, 32);
+ if (sCableCarPtr->unk_0018 == 0)
+ {
+ sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 29) % 32;
+ sCableCarPtr->unk_0018 = 12;
+ sub_812446C();
+ gUnknown_02039278 = (sCableCarPtr->unk_001a + 1) % 32;
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, 0, gUnknown_02039278, 32, 9);
+ }
+}
+
+static void sub_812476C(void)
+{
+ u8 i = 0;
+
+ sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0;
+ sCableCarPtr->unk_001f = sCableCarPtr->unk_0008;
+ sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009;
+ sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 2) % 32;
+ sCableCarPtr->unk_0018 += 2;
+ gUnknown_0203927D = sCableCarPtr->unk_001a;
+ for (i = 0; i < 9; i++)
+ {
+ gUnknown_0203927B = sCableCarPtr->unk_0019;
+ gUnknown_0203927C = (gUnknown_0203927D + i) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018];
+ gUnknown_0203927B = (gUnknown_0203927B + 1) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1];
+ }
+ gUnknown_0203927C = (sCableCarPtr->unk_001a + 23) % 32;
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, sCableCarPtr->unk_0019, gUnknown_0203927C, 2, 9);
+ if (sCableCarPtr->unk_0018 == 10)
+ {
+ sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 3) % 32;
+ sCableCarPtr->unk_0018 = 0xfe;
+ sub_812446C();
+ }
+}
+
+static void sub_81248AC(u8 a0)
+{
+ switch (a0)
+ {
+ case 0:
+ default:
+ sCableCarPtr->unk_001b = 2;
+ sCableCarPtr->unk_0019 = 0;
+ sCableCarPtr->unk_001a = 20;
+ sCableCarPtr->unk_0018 = 12;
+ sub_812446C();
+ sub_81245F4();
+ break;
+ case 1:
+ sCableCarPtr->unk_001b = 2;
+ sCableCarPtr->unk_0019 = 28;
+ sCableCarPtr->unk_001a = 20;
+ sCableCarPtr->unk_0018 = 4;
+ sub_812446C();
+ sub_812476C();
+ break;
+ }
+ sCableCarPtr->unk_001c = 0;
+}