VB Wario Land runs!

This commit is contained in:
Simon Gellis 2024-10-20 00:08:37 -04:00
parent 9f955be5dc
commit 7ace73c587
5 changed files with 96 additions and 4 deletions

65
controller.c Normal file
View File

@ -0,0 +1,65 @@
#include <controller.h>
#define VB_PWR 0x0001
#define VB_SGN 0x0002
#define VB_A 0x0004
#define VB_B 0x0008
#define VB_RT 0x0010
#define VB_LT 0x0020
#define VB_RU 0x0040
#define VB_RR 0x0080
#define VB_LR 0x0100
#define VB_LL 0x0200
#define VB_LD 0x0400
#define VB_LU 0x0800
#define VB_STA 0x1000
#define VB_SEL 0x2000
#define VB_RL 0x4000
#define VB_RD 0x8000
static uint16_t symToMask(SDL_KeyCode sym) {
switch (sym) {
default: return 0;
case SDLK_a:
return VB_SEL;
case SDLK_s:
return VB_STA;
case SDLK_d:
return VB_B;
case SDLK_f:
return VB_A;
case SDLK_e:
return VB_LT;
case SDLK_r:
return VB_RT;
case SDLK_i:
return VB_RU;
case SDLK_j:
return VB_RL;
case SDLK_k:
return VB_RD;
case SDLK_l:
return VB_RR;
case SDLK_UP:
return VB_LU;
case SDLK_LEFT:
return VB_LL;
case SDLK_DOWN:
return VB_LD;
case SDLK_RIGHT:
return VB_LR;
}
}
void ctrlInit(ControllerState *ctrl) {
ctrl->keys = VB_SGN;
}
void ctrlKeyDown(ControllerState *ctrl, SDL_Keycode sym) {
ctrl->keys |= symToMask(sym);
}
void ctrlKeyUp(ControllerState *ctrl, SDL_Keycode sym) {
ctrl->keys &= ~symToMask(sym);
}
uint16_t ctrlKeys(ControllerState *ctrl) {
return ctrl->keys;
}

16
controller.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef SHROOMS_VB_NATIVE_CONTROLLER_
#define SHROOMS_VB_NATIVE_CONTROLLER_
#include <SDL2/SDL.h>
#include <stdint.h>
typedef struct {
uint16_t keys;
} ControllerState;
void ctrlInit(ControllerState *ctrl);
void ctrlKeyDown(ControllerState *ctrl, SDL_Keycode sym);
void ctrlKeyUp(ControllerState *ctrl, SDL_Keycode sym);
uint16_t ctrlKeys(ControllerState *ctrl);
#endif

15
game.c
View File

@ -1,4 +1,5 @@
#include <assets.h> #include <assets.h>
#include <controller.h>
#include <game.h> #include <game.h>
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <stdbool.h> #include <stdbool.h>
@ -43,12 +44,15 @@ int runGame(VB *sim, GraphicsContext *gfx) {
uint32_t clocks; uint32_t clocks;
SDL_Event event; SDL_Event event;
GameState state; GameState state;
ControllerState ctrl;
uint64_t ticks, prevTicks; uint64_t ticks, prevTicks;
state.gfx = gfx; state.gfx = gfx;
vbSetUserData(sim, &state); vbSetUserData(sim, &state);
vbSetFrameCallback(sim, &onFrame); vbSetFrameCallback(sim, &onFrame);
ctrlInit(&ctrl);
gfxUpdateLeftEye(gfx, LEFT_EYE_DEFAULT); gfxUpdateLeftEye(gfx, LEFT_EYE_DEFAULT);
gfxUpdateRightEye(gfx, RIGHT_EYE_DEFAULT); gfxUpdateRightEye(gfx, RIGHT_EYE_DEFAULT);
@ -57,12 +61,19 @@ int runGame(VB *sim, GraphicsContext *gfx) {
prevTicks = tickNs(); prevTicks = tickNs();
vbEmulate(sim, &clocks); vbEmulate(sim, &clocks);
ticks = tickNs(); ticks = tickNs();
sleepNanos(((MAX_STEP_CLOCKS - clocks) * 50) - (ticks - prevTicks));
while (SDL_PollEvent(&event)) { while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) { if (event.type == SDL_QUIT) {
return 0; return 0;
} }
if (event.type == SDL_KEYDOWN) {
ctrlKeyDown(&ctrl, event.key.keysym.sym);
} }
sleepNanos(((MAX_STEP_CLOCKS - clocks) * 50) - (ticks - prevTicks)); if (event.type == SDL_KEYUP) {
prevTicks = ticks; ctrlKeyUp(&ctrl, event.key.keysym.sym);
}
}
vbSetKeys(sim, ctrlKeys(&ctrl));
} }
} }

View File

@ -11,7 +11,7 @@ else
endif endif
build: build:
@$(CC) cli.c game.c graphics.c main.c assets/assets.s -I . \ @$(CC) cli.c controller.c game.c graphics.c main.c assets/assets.s -I . \
$(SHROOMSFLAGS) $(SDL2FLAGS) \ $(SHROOMSFLAGS) $(SDL2FLAGS) \
-D POSIX_C_SOURCE=199309L \ -D POSIX_C_SOURCE=199309L \
-o shrooms-vb \ -o shrooms-vb \

@ -1 +1 @@
Subproject commit 37b9a943384a230b93089b7617d1b3f5344480d7 Subproject commit 50903c7513b00cc62cb20a1578e7f6484914a9da