Add valve intro

This commit is contained in:
James Lambert 2023-10-19 22:52:58 -06:00
parent b737f3a84e
commit e0d0b7d0ea
9 changed files with 115 additions and 6 deletions

View file

@ -45,6 +45,7 @@ RUN apt update -y && \
liblua5.4-dev \
liblua5.4-0 \
mpg123 \
ffmpeg \
wget
RUN mkdir /opt/blender

View file

@ -203,6 +203,10 @@ portal_pak_modified/%.png: portal_pak_dir/%.png assets/%.ims
@mkdir -p $(@D)
convert $< $(shell cat $(@:portal_pak_modified/%.png=assets/%.ims)) $@
build/assets/images/valve.png:
@mkdir -p $(@D)
ffmpeg -ss 00:00:04 -i vpk/Portal/hl2/media/valve.bik -frames:v 1 -q:v 2 -y build/assets/images/valve-full.png
convert build/assets/images/valve-full.png -crop 491x369+265+202 -resize 224x168 build/assets/images/valve.png
####################
## Materials
@ -216,7 +220,7 @@ build/assets/materials/ui.h build/assets/materials/ui_mat.c: assets/materials/ui
@mkdir -p $(@D)
$(SKELATOOL64) --name ui --default-material default_ui -m $< --material-output -o build/assets/materials/ui.h
build/assets/materials/images.h build/assets/materials/images_mat.c: assets/materials/images.skm.yaml $(TEXTURE_IMAGES) $(SKELATOOL64)
build/assets/materials/images.h build/assets/materials/images_mat.c: assets/materials/images.skm.yaml $(TEXTURE_IMAGES) $(SKELATOOL64) build/assets/images/valve.png
@mkdir -p $(@D)
$(SKELATOOL64) --name images --default-material default_ui -m $< --material-output -o build/assets/materials/images.h
@ -327,6 +331,7 @@ build/src/menu/new_game_menu.o: build/src/audio/clips.h build/assets/materials/u
build/src/menu/options_menu.o: build/assets/materials/ui.h
build/src/menu/save_game_menu.o: build/src/audio/clips.h
build/src/scene/scene_animator.o: build/src/audio/clips.h
build/src/levels/intro.o: build/src/audio/clips.h
build/src/menu/savefile_list.o: build/assets/materials/ui.h build/src/audio/clips.h
build/src/player/player.o: build/assets/models/player/chell.h build/assets/materials/static.h build/src/audio/subtitles.h
build/src/scene/ball_catcher.o: build/assets/models/props/combine_ball_catcher.h build/assets/materials/static.h build/assets/models/dynamic_animated_model_list.h
@ -434,12 +439,17 @@ MUSIC_ATTRIBUTES = $(shell find assets/sound/music/ -type f -name '*.msox')
INS_SOUNDS = $(shell find assets/ -type f -name '*.ins')
SOUND_CLIPS = $(SOUND_ATTRIBUTES:%.sox=build/%.aifc) $(SOUND_JATTRIBUTES:%.jsox=build/%.aifc) $(INS_SOUNDS) $(MUSIC_ATTRIBUTES:%.msox=build/%.aifc)
SOUND_CLIPS = $(SOUND_ATTRIBUTES:%.sox=build/%.aifc) $(SOUND_JATTRIBUTES:%.jsox=build/%.aifc) $(INS_SOUNDS) $(MUSIC_ATTRIBUTES:%.msox=build/%.aifc) build/assets/sound/music/valve.aifc
$(INS_SOUNDS): portal_pak_dir
portal_pak_dir/sound/music/%.wav: portal_pak_dir/sound/music/%.mp3
build/assets/sound/music/valve.aifc:
@mkdir -p $(@D)
ffmpeg -i vpk/Portal/hl2/media/valve.bik -vn -ac 1 -ar 22050 -y build/assets/sound/music/valve.wav
$(SFZ2N64) -o $@ build/assets/sound/music/valve.wav
build/assets/sound/vehicles/tank_turret_loop1.wav: portal_pak_dir
@mkdir -p $(@D)
sox portal_pak_dir/sound/vehicles/tank_turret_loop1.wav -b 16 $@

View file

@ -62,7 +62,7 @@ Install `vtf2png`, `sfz2n64`, and setup `skeletool64`.
echo "deb [trusted=yes] https://lambertjamesd.github.io/apt/ ./" \
| sudo tee /etc/apt/sources.list.d/lambertjamesd.list
sudo apt update
sudo apt install vtf2png sfz2n64 mpg123 sox imagemagick unzip
sudo apt install vtf2png sfz2n64 mpg123 sox imagemagick unzip ffmpeg
```
<br />

View file

@ -33,3 +33,6 @@ materials:
chapter11:
gDPSetTile:
filename: "../../portal_pak_modified/materials/vgui/chapters/chapter11.png"
valve:
gDPSetTile:
filename: "../../build/assets/images/valve.png"

View file

@ -69,7 +69,6 @@ void graphicsCreateTask(struct GraphicsTask* targetTask, GraphicsCallback callba
gDPSetFillColor(renderState->dl++, (GPACK_ZDZ(G_MAXFBZ,0) << 16 | GPACK_ZDZ(G_MAXFBZ,0)));
gDPFillRectangle(renderState->dl++, 0, 0, SCREEN_WD-1, SCREEN_HT-1);
gDPPipeSync(renderState->dl++);
gDPSetColorImage(renderState->dl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WD, osVirtualToPhysical(targetTask->framebuffer));

69
src/levels/intro.c Normal file
View file

@ -0,0 +1,69 @@
#include "intro.h"
#include "../util/time.h"
#include "./levels.h"
#include "../audio/soundplayer.h"
#include "../build/src/audio/clips.h"
#include "../util/memory.h"
#include "../util/rom.h"
#include "../graphics/image.h"
#include "../build/assets/materials/images.h"
#define INTRO_TIME 9.0f
#define FADE_IN_TIME 1.0f
#define IMAGE_END_TIME 7.0f
#define FADE_OUT_TIME 1.0f
#define VALVE_IMAGE_WIDTH 224
#define VALVE_IMAGE_HEIGHT 168
#define VALVE_IMAGE_SIZE (sizeof(u16) * VALVE_IMAGE_WIDTH * VALVE_IMAGE_HEIGHT)
void introInit(struct Intro* intro) {
intro->time = 0.0f;
intro->valveImage = malloc(VALVE_IMAGE_SIZE);
romCopy((char*)images_valve_rgba_16b, (char*)intro->valveImage, VALVE_IMAGE_SIZE);
soundPlayerPlay(SOUNDS_VALVE, 1.0f, 0.5f, NULL, NULL, SoundTypeMusic);
}
void introUpdate(struct Intro* intro) {
intro->time += FIXED_DELTA_TIME;
if (intro->time > INTRO_TIME) {
levelQueueLoad(MAIN_MENU, NULL, NULL);
}
}
void introRender(void* data, struct RenderState* renderState, struct GraphicsTask* task) {
struct Intro* intro = (struct Intro*)data;
struct Coloru8 fadeColor = gColorWhite;
if (intro->time < FADE_IN_TIME) {
fadeColor.a = (u8)((255.0f / FADE_IN_TIME) * intro->time);
} else if (intro->time > IMAGE_END_TIME) {
fadeColor.a = 0;
} else if (intro->time > IMAGE_END_TIME - FADE_OUT_TIME) {
fadeColor.a = (u8)((255.0f / FADE_OUT_TIME) * (IMAGE_END_TIME - intro->time));
}
gDPPipeSync(renderState->dl++);
gDPSetCycleType(renderState->dl++, G_CYC_FILL);
gDPSetFillColor(renderState->dl++, 0);
gDPFillRectangle(renderState->dl++, 0, 0, SCREEN_WD - 1, SCREEN_HT - 1);
gDPPipeSync(renderState->dl++);
gDPSetCycleType(renderState->dl++, G_CYC_1CYCLE);
graphicsCopyImage(
renderState,
intro->valveImage,
VALVE_IMAGE_WIDTH, VALVE_IMAGE_HEIGHT,
0, 0,
(SCREEN_WD - VALVE_IMAGE_WIDTH) / 2, (SCREEN_HT - VALVE_IMAGE_HEIGHT) / 2,
VALVE_IMAGE_WIDTH, VALVE_IMAGE_HEIGHT,
fadeColor
);
}

15
src/levels/intro.h Normal file
View file

@ -0,0 +1,15 @@
#ifndef __LEVELS_INTRO_H__
#define __LEVELS_INTRO_H__
#include "../graphics/graphics.h"
struct Intro {
float time;
u64* valveImage;
};
void introInit(struct Intro* intro);
void introUpdate(struct Intro* intro);
void introRender(void* data, struct RenderState* renderState, struct GraphicsTask* task);
#endif

View file

@ -4,6 +4,7 @@
#include "physics/collision_object.h"
#include "level_definition.h"
#define INTRO_MENU -4
#define MAIN_MENU -3
#define NO_QUEUED_LEVEL -2
#define NEXT_LEVEL -1

View file

@ -17,6 +17,7 @@
#include "scene/portal_surface.h"
#include "sk64/skelatool_defs.h"
#include "levels/cutscene_runner.h"
#include "levels/intro.h"
#include "savefile/savefile.h"
#include "sk64/skelatool_animator.h"
#include "util/dynamic_asset_loader.h"
@ -97,6 +98,7 @@ static void initProc(void* arg) {
struct Scene gScene;
struct GameMenu gGameMenu;
struct Intro gIntro;
extern OSMesgQueue dmaMessageQ;
@ -128,10 +130,19 @@ struct SceneCallbacks gMainMenuCallbacks = {
.updateCallback = (UpdateCallback)&mainMenuUpdate,
};
struct SceneCallbacks gIntroCallbacks = {
.data = &gIntro,
.initCallback = (InitCallback)&introInit,
.graphicsCallback = (GraphicsCallback)&introRender,
.updateCallback = (UpdateCallback)&introUpdate,
};
struct SceneCallbacks* gSceneCallbacks = &gTestChamberCallbacks;
void levelLoadWithCallbacks(int levelIndex) {
if (levelIndex == MAIN_MENU) {
if (levelIndex == INTRO_MENU) {
gSceneCallbacks = &gIntroCallbacks;
} else if (levelIndex == MAIN_MENU) {
levelLoad(0);
gSceneCallbacks = &gMainMenuCallbacks;
} else {
@ -222,7 +233,7 @@ static void gameProc(void* arg) {
setViMode(0);
osViBlack(1);
levelLoadWithCallbacks(MAIN_MENU);
levelLoadWithCallbacks(INTRO_MENU);
gCurrentTestSubject = 0;
cutsceneRunnerReset();
controllersInit();