1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-16 19:43:06 +01:00
Files
OpenRCT2/src/world/sprite.h

425 lines
12 KiB
C

/*****************************************************************************
* Copyright (c) 2014 Ted John, Peter Hill
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#ifndef _SPRITE_H_
#define _SPRITE_H_
#include "../common.h"
#include "../peep/peep.h"
#include "../ride/vehicle.h"
#define SPRITE_INDEX_NULL 0xFFFF
#define SPRITE_LOCATION_NULL ((sint16)0x8000)
#define MAX_SPRITES 10000
enum SPRITE_IDENTIFIER{
SPRITE_IDENTIFIER_VEHICLE = 0,
SPRITE_IDENTIFIER_PEEP = 1,
SPRITE_IDENTIFIER_MISC = 2,
SPRITE_IDENTIFIER_LITTER = 3,
SPRITE_IDENTIFIER_NULL = 255
};
typedef enum {
SPRITE_LINKEDLIST_OFFSET_NULL = 0,
SPRITE_LINKEDLIST_OFFSET_VEHICLE = 2,
SPRITE_LINKEDLIST_OFFSET_PEEP = 4,
SPRITE_LINKEDLIST_OFFSET_MISC = 6,
SPRITE_LINKEDLIST_OFFSET_LITTER = 8,
SPRITE_LINKEDLIST_OFFSET_UNKNOWN = 10
} SPRITE_LINKEDLIST_OFFSET;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
// Height from center of sprite to bottom
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
// Width from center of sprite to edge
uint8 sprite_width; // 0x14
// Height from center of sprite to top
uint8 sprite_height_positive; // 0x15
sint16 sprite_left; // 0x16
sint16 sprite_top; // 0x18
sint16 sprite_right; // 0x1A
sint16 sprite_bottom; // 0x1C
uint8 sprite_direction; //direction of sprite? 0x1e
uint8 pad_1F[3]; // 0x1f
uint16 name_string_idx; // 0x22
uint16 var_24;
uint16 var_26;
uint8 var_28[3];
uint8 var_2B;
uint8 pad_2C[0x45];
uint8 var_71;
} rct_unk_sprite;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 type; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 sprite_width; // 0x14
uint8 sprite_height_positive; // 0x15
uint8 pad_16[8];
uint8 sprite_direction; // 0x1E
uint8 pad_1F[5];
uint32 creationTick; // 0x24
} rct_litter;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 var_09; // 0x09
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 var_14; // 0x14
uint8 var_15; // 0x15
uint8 pad_16[0xE];
uint16 popped; // 0x24
union {
uint16 var_26;
struct {
uint8 var_26a;
uint8 var_26b;
};
};
uint8 pad_28[4];
uint8 colour; // 0x2C
uint8 var_2D;
} rct_balloon;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 var_09; // 0x09
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 var_14; // 0x14
uint8 var_15; // 0x15
uint8 pad_16[0x8];
uint8 sprite_direction; // 0x1E
uint8 pad_1F[0x7];
uint16 var_26;
uint8 pad_28[0x8];
sint16 target_x; // 0x30
sint16 target_y; // 0x32
uint8 pad_34[0x14];
uint8 state; // 0x48
} rct_duck;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 var_09;
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 var_14;
uint8 var_15;
uint8 pad_16[0x8];
uint8 sprite_direction; // 0x1E
uint8 pad_1F[0x7];
union {
uint16 var_26;
struct {
uint8 var_26a;
uint8 var_26b;
};
};
uint8 pad_28[0x6];
uint8 var_2E;
uint8 fountain_flags; // 0x2F
sint16 target_x; // 0x30
sint16 target_y; // 0x32
uint8 pad_34[0x12];
uint16 iteration; // 0x46
} rct_jumping_fountain;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 var_02; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 var_09;
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 var_14;
uint8 var_15;
uint8 pad_16[0xE];
uint16 move_delay; // 0x24
uint16 num_movements; // 0x26
money32 value; // 0x28
uint8 pad_2C[0x18];
sint16 offset_x; // 0x44
uint16 wiggle; // 0x46
} rct_money_effect;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
// Height from center of sprite to bottom
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
// Width from center of sprite to edge
uint8 sprite_width; // 0x14
// Height from center of sprite to top
uint8 sprite_height_positive; // 0x15
sint16 sprite_left; // 0x16
sint16 sprite_top; // 0x18
sint16 sprite_right; // 0x1A
sint16 sprite_bottom; // 0x1C
uint8 sprite_direction; //direction of sprite? 0x1e
uint8 pad_1F[3]; // 0x1f
uint16 name_string_idx; // 0x22
uint16 var_24;
uint16 var_26;
uint8 var_28[3];
uint8 var_2B;
uint8 colour[2];
uint16 var_2E;
sint16 velocity_x; // 0x30
sint16 velocity_y; // 0x32
sint16 velocity_z; // 0x34
uint16 pad_36;
sint32 acceleration_x; // 0x38
sint32 acceleration_y; // 0x3C
sint32 acceleration_z; // 0x40
uint8 pad_44[0x2D];
uint8 var_71;
} rct_crashed_vehicle_particle;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
// Height from center of sprite to bottom
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
// Width from center of sprite to edge
uint8 sprite_width; // 0x14
// Height from center of sprite to top
uint8 sprite_height_positive; // 0x15
sint16 sprite_left; // 0x16
sint16 sprite_top; // 0x18
sint16 sprite_right; // 0x1A
sint16 sprite_bottom; // 0x1C
uint8 sprite_direction; //direction of sprite? 0x1e
uint8 pad_1F[3]; // 0x1f
uint16 name_string_idx; // 0x22
uint16 var_24;
uint16 var_26;
} rct_crash_splash;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
// Height from center of sprite to bottom
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint16 flags; // 0x0C
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
// Width from center of sprite to edge
uint8 sprite_width; // 0x14
// Height from center of sprite to top
uint8 sprite_height_positive; // 0x15
sint16 sprite_left; // 0x16
sint16 sprite_top; // 0x18
sint16 sprite_right; // 0x1A
sint16 sprite_bottom; // 0x1C
uint8 sprite_direction; // 0x1E
uint8 pad_1F[3]; // 0x1F
uint16 name_string_idx; // 0x22
uint16 var_24;
uint16 var_26;
} rct_steam_particle;
/**
* Sprite structure.
* size: 0x0100
*/
typedef union {
uint8 pad_00[0x100];
rct_unk_sprite unknown;
rct_peep peep;
rct_litter litter;
rct_vehicle vehicle;
rct_balloon balloon;
rct_duck duck;
rct_jumping_fountain jumping_fountain;
rct_money_effect money_effect;
rct_crashed_vehicle_particle crashed_vehicle_particle;
rct_crash_splash crash_splash;
rct_steam_particle steam_particle;
} rct_sprite;
typedef struct {
uint8 sprite_width; // 0x00
uint8 sprite_height_negative; // 0x01
uint8 sprite_height_positive; // 0x02
uint8 unused; // 0x03
} rct_sprite_bounds;
typedef struct {
uint32 base_image; // 0x00
uint8* unkn_04; // 0x04
} rct_sprite_image;
typedef struct {
rct_sprite_image *sprite_image; // 0x00
rct_sprite_bounds *sprite_bounds; // 0x04
} rct_sprite_entry;
enum {
SPRITE_MISC_STEAM_PARTICLE,
SPRITE_MISC_MONEY_EFFECT,
SPRITE_MISC_CRASHED_VEHICLE_PARTICLE,
SPRITE_MISC_3, // (related to vehicle crash, probably crash particles)
SPRITE_MISC_CRASH_SPLASH,
SPRITE_MISC_5, // (related to vehicle crash, probably crash particles)
SPRITE_MISC_JUMPING_FOUNTAIN_WATER,
SPRITE_MISC_BALLOON,
SPRITE_MISC_DUCK,
SPRITE_MISC_JUMPING_FOUNTAIN_SNOW
};
enum {
SPRITE_FLAGS_IS_CRASHED_VEHICLE_SPRITE = 1 << 7,
SPRITE_FLAGS_PEEP_VISIBLE = 1 << 8, // Peep is eligible to show in summarized guest list window (is inside park?)
SPRITE_FLAGS_PEEP_FLASHING = 1 << 9, // Peep belongs to highlighted group (flashes red on map)
};
// rct2: 0x010E63BC
extern rct_sprite* g_sprite_list;
// rct2: 0x00982708
extern rct_sprite_entry* g_sprite_entries;
rct_sprite *create_sprite(uint8 bl);
void reset_sprite_list();
void reset_0x69EBE4();
void sprite_clear_all_unused();
void move_sprite_to_list(rct_sprite *sprite, uint8 cl);
void sprite_misc_update_all();
void sprite_move(sint16 x, sint16 y, sint16 z, rct_sprite* sprite);
void invalidate_sprite_0(rct_sprite* sprite);
void invalidate_sprite_1(rct_sprite *sprite);
void invalidate_sprite_2(rct_sprite *sprite);
void sprite_remove(rct_sprite *sprite);
void litter_create(int x, int y, int z, int direction, int type);
void litter_remove_at(int x, int y, int z);
void sprite_misc_3_create(int x, int y, int z);
void sprite_misc_5_create(int x, int y, int z);
uint16 sprite_get_first_in_quadrant(int x, int y);
///////////////////////////////////////////////////////////////
// Balloon
///////////////////////////////////////////////////////////////
void create_balloon(int x, int y, int z, int colour, uint8 bl);
void balloon_update(rct_balloon *balloon);
void balloon_press(rct_balloon *balloon);
///////////////////////////////////////////////////////////////
// Duck
///////////////////////////////////////////////////////////////
void create_duck(int targetX, int targetY);
void duck_update(rct_duck *duck);
void duck_press(rct_duck *duck);
void duck_remove_all();
///////////////////////////////////////////////////////////////
// Money effect
///////////////////////////////////////////////////////////////
void money_effect_create(money32 value);
void money_effect_update(rct_money_effect *moneyEffect);
///////////////////////////////////////////////////////////////
// Crash particles
///////////////////////////////////////////////////////////////
void crashed_vehicle_particle_create(rct_vehicle_colour colours, int x, int y, int z);
void crashed_vehicle_particle_update(rct_crashed_vehicle_particle *particle);
void crash_splash_create(int x, int y, int z);
void crash_splash_update(rct_crash_splash *splash);
#endif