[FL-1427] Dolphin: new assets and engine rework (#546)

This commit is contained in:
its your bedtime
2021-08-05 23:49:04 +03:00
committed by GitHub
parent 5741ed2bd5
commit 9c38efd4ef
118 changed files with 1055 additions and 419 deletions
@@ -1,74 +1,32 @@
#include <furi.h>
#include "scene.h"
#include "assets/emotes.h"
static uint16_t roll_new(uint16_t prev, uint16_t max) {
uint16_t val = 999;
while(val != prev) {
val = random() % max;
break;
}
return val;
}
#include "assets/items.h"
static void scene_proceed_action(SceneState* state) {
furi_assert(state);
state->prev_action = state->action;
state->action = (state->prev_action != state->next_action) ?
state->next_action :
roll_new(state->next_action, ACTIONS_NUM);
state->action = roll_new(state->prev_action, ACTIONS_NUM);
state->action_timeout = default_timeout[state->action];
}
static void scene_dolphin_go_to_poi(SceneState* state) {
furi_assert(state);
if(state->player_global.x < state->poi) {
state->player_flipped = false;
state->player_v.x = SPEED_X / 2;
} else if(state->player_global.x > state->poi) {
state->player_flipped = true;
state->player_v.x = -SPEED_X / 2;
}
}
static void scene_action_handler(SceneState* state) {
furi_assert(state);
if(state->action == MINDCONTROL && state->player_v.x != 0) {
state->action_timeout = default_timeout[state->action];
if(state->action == MINDCONTROL) {
if(state->player_v.x != 0 || state->player_v.y != 0) {
state->action_timeout = default_timeout[state->action];
}
}
if(state->action_timeout > 0) {
state->action_timeout--;
} else {
if(random() % 1000 > 500) {
state->next_action = roll_new(state->prev_action, ACTIONS_NUM);
state->poi = roll_new(state->player_global.x, WORLD_WIDTH / 4);
}
}
}
void dolphin_scene_update_state(SceneState* state, uint32_t t, uint32_t dt) {
furi_assert(state);
scene_action_handler(state);
UNUSED(dialogues_list);
switch(state->action) {
case WALK:
if(state->player_global.x == state->poi) {
state->player_v.x = 0;
scene_proceed_action(state);
} else {
scene_dolphin_go_to_poi(state);
}
break;
case EMOTE:
state->player_flipped = false;
if(state->action_timeout == 0) {
scene_proceed_action(state);
state->emote_id = roll_new(state->previous_emote, SIZEOF_ARRAY(emotes_list));
break;
}
case INTERACT:
if(state->action_timeout == 0) {
if(state->prev_action == MINDCONTROL) {
@@ -78,20 +36,9 @@ void dolphin_scene_update_state(SceneState* state, uint32_t t, uint32_t dt) {
}
}
break;
case SLEEP:
if(state->poi != 154) { // temp
state->poi = 154;
} else if(state->player_global.x != state->poi) {
scene_dolphin_go_to_poi(state);
} else {
state->player_v.x = 0;
if(state->action_timeout == 0) {
state->poi = roll_new(state->player_global.x, WORLD_WIDTH / 4);
scene_proceed_action(state);
}
break;
}
default:
if(state->action_timeout == 0) {
scene_proceed_action(state);
}