OVERLAP mode renamed to OVERLINE
also, TIC uses palette from VRAM instead cart palette in OVR
This commit is contained in:
parent
57624e3c77
commit
96e2c19a5f
|
@ -915,7 +915,7 @@ static void callJavascriptScanline(tic_mem* memory, s32 row, void* data)
|
|||
callJavascriptScanlineName(memory, row, data, "scanline");
|
||||
}
|
||||
|
||||
static void callJavascriptOverlap(tic_mem* memory, void* data)
|
||||
static void callJavascriptOverline(tic_mem* memory, void* data)
|
||||
{
|
||||
tic_machine* machine = (tic_machine*)memory;
|
||||
duk_context* duk = machine->js;
|
||||
|
@ -1007,7 +1007,7 @@ static const tic_script_config JsSyntaxConfig =
|
|||
.close = closeJavascript,
|
||||
.tick = callJavascriptTick,
|
||||
.scanline = callJavascriptScanline,
|
||||
.overlap = callJavascriptOverlap,
|
||||
.overline = callJavascriptOverline,
|
||||
|
||||
.getOutline = getJsOutline,
|
||||
.parse = parseCode,
|
||||
|
|
|
@ -1307,7 +1307,7 @@ static void callLuaScanline(tic_mem* memory, s32 row, void* data)
|
|||
callLuaScanlineName(memory, row, data, "scanline");
|
||||
}
|
||||
|
||||
static void callLuaOverlap(tic_mem* memory, void* data)
|
||||
static void callLuaOverline(tic_mem* memory, void* data)
|
||||
{
|
||||
tic_machine* machine = (tic_machine*)memory;
|
||||
lua_State* lua = machine->lua;
|
||||
|
@ -1403,7 +1403,7 @@ static const tic_script_config LuaSyntaxConfig =
|
|||
.close = closeLua,
|
||||
.tick = callLuaTick,
|
||||
.scanline = callLuaScanline,
|
||||
.overlap = callLuaOverlap,
|
||||
.overline = callLuaOverline,
|
||||
|
||||
.getOutline = getLuaOutline,
|
||||
.parse = parseCode,
|
||||
|
@ -1588,7 +1588,7 @@ static const tic_script_config MoonSyntaxConfig =
|
|||
.close = closeLua,
|
||||
.tick = callLuaTick,
|
||||
.scanline = callLuaScanline,
|
||||
.overlap = callLuaOverlap,
|
||||
.overline = callLuaOverline,
|
||||
|
||||
.getOutline = getMoonOutline,
|
||||
.parse = parseCode,
|
||||
|
|
|
@ -103,7 +103,7 @@ typedef struct
|
|||
|
||||
struct
|
||||
{
|
||||
tic_overlap callback;
|
||||
tic_overline callback;
|
||||
u32 palette[TIC_PALETTE_SIZE];
|
||||
} ovr;
|
||||
|
||||
|
|
35
src/map.c
35
src/map.c
|
@ -142,6 +142,12 @@ static s32 drawGridButton(Map* map, s32 x, s32 y)
|
|||
return x;
|
||||
}
|
||||
|
||||
static bool sheetVisible(Map* map)
|
||||
{
|
||||
tic_mem* tic = map->tic;
|
||||
return tic->api.key(tic, tic_key_shift) || map->sheet.show;
|
||||
}
|
||||
|
||||
static s32 drawSheetButton(Map* map, s32 x, s32 y)
|
||||
{
|
||||
static const u8 DownIcon[] =
|
||||
|
@ -186,7 +192,7 @@ static s32 drawSheetButton(Map* map, s32 x, s32 y)
|
|||
}
|
||||
}
|
||||
|
||||
drawBitIcon(rect.x, rect.y, map->sheet.show ? UpIcon : DownIcon, over ? (tic_color_dark_gray) : (tic_color_light_blue));
|
||||
drawBitIcon(rect.x, rect.y, sheetVisible(map) ? UpIcon : DownIcon, over ? (tic_color_dark_gray) : (tic_color_light_blue));
|
||||
|
||||
return x;
|
||||
}
|
||||
|
@ -291,7 +297,7 @@ static void drawTileIndex(Map* map, s32 x, s32 y)
|
|||
{
|
||||
s32 index = -1;
|
||||
|
||||
if(map->sheet.show)
|
||||
if(sheetVisible(map))
|
||||
{
|
||||
tic_rect rect = {TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE, TIC_SPRITESHEET_SIZE, TIC_SPRITESHEET_SIZE};
|
||||
|
||||
|
@ -344,7 +350,7 @@ static void drawMapToolbar(Map* map, s32 x, s32 y)
|
|||
|
||||
static void drawSheet(Map* map, s32 x, s32 y)
|
||||
{
|
||||
if(!map->sheet.show)return;
|
||||
if(!sheetVisible(map))return;
|
||||
|
||||
tic_rect rect = {x, y, TIC_SPRITESHEET_SIZE, TIC_SPRITESHEET_SIZE};
|
||||
|
||||
|
@ -353,7 +359,7 @@ static void drawSheet(Map* map, s32 x, s32 y)
|
|||
|
||||
static void drawSheetOvr(Map* map, s32 x, s32 y)
|
||||
{
|
||||
if(!map->sheet.show)return;
|
||||
if(!sheetVisible(map))return;
|
||||
|
||||
tic_rect rect = {x, y, TIC_SPRITESHEET_SIZE, TIC_SPRITESHEET_SIZE};
|
||||
|
||||
|
@ -879,7 +885,7 @@ static void drawMapOvr(Map* map)
|
|||
tic->api.line(tic, TIC80_WIDTH - screenScrollX, 0, TIC80_WIDTH - screenScrollX, TIC80_HEIGHT, (tic_color_gray));
|
||||
}
|
||||
|
||||
if(!map->sheet.show && checkMousePos(&rect))
|
||||
if(!sheetVisible(map) && checkMousePos(&rect))
|
||||
{
|
||||
if(tic->api.key(tic, tic_key_space))
|
||||
{
|
||||
|
@ -1009,9 +1015,6 @@ static void processKeyboard(Map* map)
|
|||
|
||||
if(tic->ram.input.keyboard.data == 0) return;
|
||||
|
||||
map->sheet.show = false;
|
||||
|
||||
bool shift = tic->api.key(tic, tic_key_shift);
|
||||
bool ctrl = tic->api.key(tic, tic_key_ctrl);
|
||||
|
||||
switch(getClipboardEvent())
|
||||
|
@ -1038,9 +1041,6 @@ static void processKeyboard(Map* map)
|
|||
else if(keyWasPressed(tic_key_grave)) map->canvas.grid = !map->canvas.grid;
|
||||
}
|
||||
|
||||
if(shift)
|
||||
map->sheet.show = true;
|
||||
|
||||
enum{Step = 1};
|
||||
|
||||
if(tic->api.key(tic, tic_key_up)) map->scroll.y -= Step;
|
||||
|
@ -1083,11 +1083,17 @@ static void onStudioEvent(Map* map, StudioEvent event)
|
|||
}
|
||||
}
|
||||
|
||||
static void overlap(tic_mem* tic, void* data)
|
||||
static void scanline(tic_mem* tic, s32 row, void* data)
|
||||
{
|
||||
if(row == 0)
|
||||
memcpy(tic->ram.vram.palette.data, tic->config.palette.data, sizeof(tic_palette));
|
||||
}
|
||||
|
||||
static void overline(tic_mem* tic, void* data)
|
||||
{
|
||||
Map* map = (Map*)data;
|
||||
|
||||
tic->api.clip(tic, 0, TOOLBAR_SIZE, TIC80_WIDTH - (map->sheet.show ? TIC_SPRITESHEET_SIZE+2 : 0), TIC80_HEIGHT - TOOLBAR_SIZE);
|
||||
tic->api.clip(tic, 0, TOOLBAR_SIZE, TIC80_WIDTH - (sheetVisible(map) ? TIC_SPRITESHEET_SIZE+2 : 0), TIC80_HEIGHT - TOOLBAR_SIZE);
|
||||
drawMapOvr(map);
|
||||
tic->api.clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT);
|
||||
drawSheetOvr(map, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE);
|
||||
|
@ -1134,7 +1140,8 @@ void initMap(Map* map, tic_mem* tic, tic_map* src)
|
|||
},
|
||||
.history = history_create(src, sizeof(tic_map)),
|
||||
.event = onStudioEvent,
|
||||
.overlap = overlap,
|
||||
.overline = overline,
|
||||
.scanline = scanline,
|
||||
};
|
||||
|
||||
normalizeMap(&map->scroll.x, &map->scroll.y);
|
||||
|
|
|
@ -80,9 +80,10 @@ struct Map
|
|||
|
||||
struct History* history;
|
||||
|
||||
void(*tick)(Map*);
|
||||
void(*event)(Map*, StudioEvent);
|
||||
void(*overlap)(tic_mem* tic, void* data);
|
||||
void (*tick)(Map*);
|
||||
void (*event)(Map*, StudioEvent);
|
||||
void (*scanline)(tic_mem* tic, s32 row, void* data);
|
||||
void (*overline)(tic_mem* tic, void* data);
|
||||
};
|
||||
|
||||
void initMap(Map*, tic_mem*, tic_map* src);
|
||||
|
|
11
src/sprite.c
11
src/sprite.c
|
@ -1625,7 +1625,13 @@ static void onStudioEvent(Sprite* sprite, StudioEvent event)
|
|||
}
|
||||
}
|
||||
|
||||
static void overlap(tic_mem* tic, void* data)
|
||||
static void scanline(tic_mem* tic, s32 row, void* data)
|
||||
{
|
||||
if(row == 0)
|
||||
memcpy(tic->ram.vram.palette.data, tic->config.palette.data, sizeof(tic_palette));
|
||||
}
|
||||
|
||||
static void overline(tic_mem* tic, void* data)
|
||||
{
|
||||
Sprite* sprite = (Sprite*)data;
|
||||
|
||||
|
@ -1666,6 +1672,7 @@ void initSprite(Sprite* sprite, tic_mem* tic, tic_tiles* src)
|
|||
.mode = SPRITE_DRAW_MODE,
|
||||
.history = history_create(src, TIC_SPRITES * sizeof(tic_tile)),
|
||||
.event = onStudioEvent,
|
||||
.overlap = overlap,
|
||||
.overline = overline,
|
||||
.scanline = scanline,
|
||||
};
|
||||
}
|
|
@ -63,7 +63,8 @@ struct Sprite
|
|||
|
||||
void (*tick)(Sprite*);
|
||||
void (*event)(Sprite*, StudioEvent);
|
||||
void (*overlap)(tic_mem* tic, void* data);
|
||||
void (*scanline)(tic_mem* tic, s32 row, void* data);
|
||||
void (*overline)(tic_mem* tic, void* data);
|
||||
};
|
||||
|
||||
void initSprite(Sprite*, tic_mem*, tic_tiles* src);
|
24
src/studio.c
24
src/studio.c
|
@ -1208,7 +1208,7 @@ static void setCoverImage()
|
|||
{
|
||||
enum {Pitch = TIC80_FULLWIDTH*sizeof(u32)};
|
||||
|
||||
tic->api.blit(tic, tic->api.scanline, tic->api.overlap, NULL);
|
||||
tic->api.blit(tic, tic->api.scanline, tic->api.overline, NULL);
|
||||
|
||||
u32* buffer = malloc(TIC80_WIDTH * TIC80_HEIGHT * sizeof(u32));
|
||||
|
||||
|
@ -1515,11 +1515,6 @@ static void recordFrame(u32* pixels)
|
|||
}
|
||||
}
|
||||
|
||||
static void useSystemPalette()
|
||||
{
|
||||
memcpy(impl.studio.tic->ram.vram.palette.data, impl.studio.tic->config.palette.data, sizeof(tic_palette));
|
||||
}
|
||||
|
||||
static void drawPopup()
|
||||
{
|
||||
if(impl.popup.counter > 0)
|
||||
|
@ -1622,9 +1617,6 @@ static void renderStudio()
|
|||
memset(tic->ram.registers, 0, sizeof tic->ram.registers);
|
||||
|
||||
impl.studio.tic->api.tick_end(impl.studio.tic);
|
||||
|
||||
if(impl.mode != TIC_RUN_MODE)
|
||||
useSystemPalette();
|
||||
}
|
||||
|
||||
static void updateSystemFont()
|
||||
|
@ -1735,34 +1727,38 @@ static void studioTick()
|
|||
|
||||
{
|
||||
tic_scanline scanline = NULL;
|
||||
tic_overlap overlap = NULL;
|
||||
tic_overline overline = NULL;
|
||||
void* data = NULL;
|
||||
|
||||
switch(impl.mode)
|
||||
{
|
||||
case TIC_RUN_MODE:
|
||||
scanline = tic->api.scanline;
|
||||
overlap = tic->api.overlap;
|
||||
overline = tic->api.overline;
|
||||
break;
|
||||
case TIC_SPRITE_MODE:
|
||||
{
|
||||
Sprite* sprite = impl.editor[impl.bank.index.sprites].sprite;
|
||||
overlap = sprite->overlap;
|
||||
overline = sprite->overline;
|
||||
scanline = sprite->scanline;
|
||||
data = sprite;
|
||||
memcpy(&tic->ram.vram.palette, &tic->cart.palette, sizeof(tic_palette));
|
||||
}
|
||||
break;
|
||||
case TIC_MAP_MODE:
|
||||
{
|
||||
Map* map = impl.editor[impl.bank.index.map].map;
|
||||
overlap = map->overlap;
|
||||
overline = map->overline;
|
||||
data = map;
|
||||
memcpy(&tic->ram.vram.palette, &tic->cart.palette, sizeof(tic_palette));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
memcpy(&tic->ram.vram.palette, &tic->config.palette, sizeof(tic_palette));
|
||||
break;
|
||||
}
|
||||
|
||||
tic->api.blit(tic, scanline, overlap, data);
|
||||
tic->api.blit(tic, scanline, overline, data);
|
||||
|
||||
recordFrame(tic->screen);
|
||||
drawDesyncLabel(tic->screen);
|
||||
|
|
18
src/tic.c
18
src/tic.c
|
@ -1393,7 +1393,6 @@ static void api_tick_end(tic_mem* memory)
|
|||
machine->state.setpix = setPixelOvr;
|
||||
machine->state.getpix = getPixelOvr;
|
||||
machine->state.drawhline = drawHLineOvr;
|
||||
memcpy(machine->state.ovr.palette, tic_palette_blit(&memory->cart.palette), sizeof machine->state.ovr.palette);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1667,7 +1666,7 @@ static void api_tick(tic_mem* tic, tic_tick_data* data)
|
|||
{
|
||||
machine->state.tick = config->tick;
|
||||
machine->state.scanline = config->scanline;
|
||||
machine->state.ovr.callback = config->overlap;
|
||||
machine->state.ovr.callback = config->overline;
|
||||
|
||||
machine->state.initialized = true;
|
||||
}
|
||||
|
@ -1686,7 +1685,7 @@ static void api_scanline(tic_mem* memory, s32 row, void* data)
|
|||
machine->state.scanline(memory, row, data);
|
||||
}
|
||||
|
||||
static void api_overlap(tic_mem* memory, void* data)
|
||||
static void api_overline(tic_mem* memory, void* data)
|
||||
{
|
||||
tic_machine* machine = (tic_machine*)memory;
|
||||
|
||||
|
@ -1910,10 +1909,15 @@ static inline void memset4(void *dst, u32 val, u32 dwords)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void api_blit(tic_mem* tic, tic_scanline scanline, tic_overlap overlap, void* data)
|
||||
static void api_blit(tic_mem* tic, tic_scanline scanline, tic_overline overline, void* data)
|
||||
{
|
||||
const u32* pal = tic_palette_blit(&tic->ram.vram.palette);
|
||||
|
||||
{
|
||||
tic_machine* machine = (tic_machine*)tic;
|
||||
memcpy(machine->state.ovr.palette, pal, sizeof machine->state.ovr.palette);
|
||||
}
|
||||
|
||||
if(scanline)
|
||||
{
|
||||
scanline(tic, 0, data);
|
||||
|
@ -1954,8 +1958,8 @@ static void api_blit(tic_mem* tic, tic_scanline scanline, tic_overlap overlap, v
|
|||
|
||||
memset4(&out[(TIC80_FULLHEIGHT-Bottom) * TIC80_FULLWIDTH], pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH*Bottom);
|
||||
|
||||
if(overlap)
|
||||
overlap(tic, data);
|
||||
if(overline)
|
||||
overline(tic, data);
|
||||
}
|
||||
|
||||
static void initApi(tic_api* api)
|
||||
|
@ -1992,7 +1996,7 @@ static void initApi(tic_api* api)
|
|||
INIT_API(time);
|
||||
INIT_API(tick);
|
||||
INIT_API(scanline);
|
||||
INIT_API(overlap);
|
||||
INIT_API(overline);
|
||||
INIT_API(reset);
|
||||
INIT_API(pause);
|
||||
INIT_API(resume);
|
||||
|
|
|
@ -124,7 +124,7 @@ TIC80_API void tic80_tick(tic80* tic, tic80_input input)
|
|||
tic80->memory->api.tick(tic80->memory, &tic80->tickData);
|
||||
tic80->memory->api.tick_end(tic80->memory);
|
||||
|
||||
tic80->memory->api.blit(tic80->memory, tic80->memory->api.scanline, tic80->memory->api.overlap, NULL);
|
||||
tic80->memory->api.blit(tic80->memory, tic80->memory->api.scanline, tic80->memory->api.overline, NULL);
|
||||
|
||||
TickCounter++;
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ typedef struct
|
|||
typedef struct tic_mem tic_mem;
|
||||
typedef void(*tic_tick)(tic_mem* memory);
|
||||
typedef void(*tic_scanline)(tic_mem* memory, s32 row, void* data);
|
||||
typedef void(*tic_overlap)(tic_mem* memory, void* data);
|
||||
typedef void(*tic_overline)(tic_mem* memory, void* data);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -99,7 +99,7 @@ struct tic_script_config
|
|||
|
||||
tic_tick tick;
|
||||
tic_scanline scanline;
|
||||
tic_overlap overlap;
|
||||
tic_overline overline;
|
||||
};
|
||||
|
||||
const tic_outline_item* (*getOutline)(const char* code, s32* size);
|
||||
|
@ -150,7 +150,7 @@ typedef struct
|
|||
double (*time) (tic_mem* memory);
|
||||
void (*tick) (tic_mem* memory, tic_tick_data* data);
|
||||
void (*scanline) (tic_mem* memory, s32 row, void* data);
|
||||
void (*overlap) (tic_mem* memory, void* data);
|
||||
void (*overline) (tic_mem* memory, void* data);
|
||||
void (*reset) (tic_mem* memory);
|
||||
void (*pause) (tic_mem* memory);
|
||||
void (*resume) (tic_mem* memory);
|
||||
|
@ -164,7 +164,7 @@ typedef struct
|
|||
|
||||
void (*tick_start) (tic_mem* memory, const tic_sfx* sfx, const tic_music* music);
|
||||
void (*tick_end) (tic_mem* memory);
|
||||
void (*blit) (tic_mem* tic, tic_scanline scanline, tic_overlap overlap, void* data);
|
||||
void (*blit) (tic_mem* tic, tic_scanline scanline, tic_overline overline, void* data);
|
||||
|
||||
const tic_script_config* (*get_script_config)(tic_mem* memory);
|
||||
} tic_api;
|
||||
|
|
|
@ -36,7 +36,7 @@ static WrenHandle* game_class;
|
|||
static WrenHandle* new_handle;
|
||||
static WrenHandle* update_handle;
|
||||
static WrenHandle* scanline_handle;
|
||||
static WrenHandle* overlap_handle;
|
||||
static WrenHandle* overline_handle;
|
||||
|
||||
static bool loaded = false;
|
||||
|
||||
|
@ -199,7 +199,7 @@ static void closeWren(tic_mem* tic)
|
|||
wrenReleaseHandle(machine->wren, new_handle);
|
||||
wrenReleaseHandle(machine->wren, update_handle);
|
||||
wrenReleaseHandle(machine->wren, scanline_handle);
|
||||
wrenReleaseHandle(machine->wren, overlap_handle);
|
||||
wrenReleaseHandle(machine->wren, overline_handle);
|
||||
if (game_class != NULL) {
|
||||
wrenReleaseHandle(machine->wren, game_class);
|
||||
}
|
||||
|
@ -1263,7 +1263,7 @@ static bool initWren(tic_mem* tic, const char* code)
|
|||
new_handle = wrenMakeCallHandle(vm, "new()");
|
||||
update_handle = wrenMakeCallHandle(vm, TIC_FN "()");
|
||||
scanline_handle = wrenMakeCallHandle(vm, SCN_FN "(_)");
|
||||
overlap_handle = wrenMakeCallHandle(vm, OVR_FN "()");
|
||||
overline_handle = wrenMakeCallHandle(vm, OVR_FN "()");
|
||||
|
||||
// create game class
|
||||
if (game_class)
|
||||
|
@ -1313,7 +1313,7 @@ static void callWrenScanline(tic_mem* memory, s32 row, void* data)
|
|||
}
|
||||
}
|
||||
|
||||
static void callWrenOverlap(tic_mem* memory, void* data)
|
||||
static void callWrenOverline(tic_mem* memory, void* data)
|
||||
{
|
||||
tic_machine* machine = (tic_machine*)memory;
|
||||
WrenVM* vm = machine->wren;
|
||||
|
@ -1322,7 +1322,7 @@ static void callWrenOverlap(tic_mem* memory, void* data)
|
|||
{
|
||||
wrenEnsureSlots(vm, 1);
|
||||
wrenSetSlotHandle(vm, 0, game_class);
|
||||
wrenCall(vm, overlap_handle);
|
||||
wrenCall(vm, overline_handle);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1350,7 +1350,7 @@ static const tic_script_config WrenSyntaxConfig =
|
|||
.close = closeWren,
|
||||
.tick = callWrenTick,
|
||||
.scanline = callWrenScanline,
|
||||
.overlap = callWrenOverlap,
|
||||
.overline = callWrenOverline,
|
||||
|
||||
.getOutline = getWrenOutline,
|
||||
.parse = parseCode,
|
||||
|
|
Loading…
Reference in New Issue