mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-09-22 22:48:08 +03:00
165 lines
4.1 KiB
C
165 lines
4.1 KiB
C
/*
|
|
* sactlog.c: バックログ
|
|
*
|
|
* Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
|
|
* 1998- <masaki-c@is.aist-nara.ac.jp>
|
|
*
|
|
* This program 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 2 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, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
/* $Id: sactlog.c,v 1.3 2004/10/31 04:18:02 chikama Exp $ */
|
|
|
|
#include "config.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <SDL.h>
|
|
|
|
#include "portab.h"
|
|
#include "system.h"
|
|
#include "list.h"
|
|
#include "menu.h"
|
|
#include "input.h"
|
|
#include "nact.h"
|
|
#include "sact.h"
|
|
#include "sprite.h"
|
|
#include "gfx.h"
|
|
#include "ags.h"
|
|
#include "font.h"
|
|
|
|
#define LOGMSG_LINES 6
|
|
|
|
static char *logmsg[LOGMSG_LINES] = {
|
|
"\n",
|
|
"※バックログ操作方法※",
|
|
"[ESC]またはマウス右クリックでゲームに戻る",
|
|
"[PageUp][PageDown]でページスクロール",
|
|
"[↑][↓]またはマウスホイールで行スクロール",
|
|
"\n",
|
|
};
|
|
|
|
/*
|
|
ホイールで上下スクロール
|
|
ESCキーで終了
|
|
PageUP/Downで1ページ送り
|
|
*/
|
|
|
|
#define INDEX_FONTSIZE 10
|
|
#define FONTSIZE 20
|
|
#define LOGLINENUM (main_surface->h / FONTSIZE)
|
|
static int curline;
|
|
static SDL_Surface *back;
|
|
|
|
static void draw_log() {
|
|
int i, y = 0, len;
|
|
int cur = curline;
|
|
char pinfo[256];
|
|
List *node;
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
load_mincho_font();
|
|
#endif
|
|
|
|
SDL_Surface *hline = SDL_CreateRGBSurfaceWithFormat(0, main_surface->w, 3, 32, SDL_PIXELFORMAT_RGB888);
|
|
SDL_FillRect(hline, NULL, SDL_MapRGB(hline->format, 255, 255, 255));
|
|
SDL_SetSurfaceBlendMode(hline, SDL_BLENDMODE_BLEND);
|
|
SDL_SetSurfaceAlphaMod(hline, 128);
|
|
|
|
SDL_SetSurfaceColorMod(back, 128, 128, 128);
|
|
SDL_BlitSurface(back, NULL, main_surface, NULL);
|
|
SDL_SetSurfaceColorMod(back, 255, 255, 255);
|
|
|
|
// ページ位置情報
|
|
len = snprintf(pinfo, sizeof(pinfo) -1, "%d/%d", curline, list_length(sact.log));
|
|
|
|
gfx_drawString(main_surface->w - INDEX_FONTSIZE * len / 2, 0, pinfo, 255,
|
|
(FontSpec){ .size = INDEX_FONTSIZE });
|
|
|
|
// 表示始め位置
|
|
node = list_nth(sact.log, list_length(sact.log) - curline);
|
|
for (i = 0; i < LOGLINENUM; i++) {
|
|
if (cur <= 0) continue;
|
|
|
|
char *str = (char *)(node->data);
|
|
if (0 == strcmp(str, "\n")) {
|
|
SDL_BlitSurface(hline, NULL, main_surface, &(SDL_Rect){0, y + FONTSIZE/2, main_surface->w, 3});
|
|
} else {
|
|
FontSpec font_spec = {
|
|
.type = cur < 6 ? FONT_MINCHO : FONT_GOTHIC,
|
|
.weight = cur < 6 ? FONT_WEIGHT_NORMAL : FONT_WEIGHT_BOLD,
|
|
.size = FONTSIZE
|
|
};
|
|
gfx_drawString(0, y, str, 255, font_spec);
|
|
}
|
|
y += FONTSIZE;
|
|
cur--;
|
|
node = list_next(node);
|
|
}
|
|
|
|
ags_updateFull();
|
|
}
|
|
|
|
|
|
|
|
bool sblog_start(void) {
|
|
if (sact.version < 120)
|
|
return false;
|
|
|
|
// Append instruction text
|
|
for (int i = 0; i < LOGMSG_LINES; i++)
|
|
sact.log = list_append(sact.log, logmsg[i]);
|
|
|
|
back = SDL_ConvertSurface(main_surface, main_surface->format, 0);
|
|
curline = 6;
|
|
draw_log();
|
|
return true;
|
|
}
|
|
|
|
void sblog_end(void) {
|
|
List *node;
|
|
int i;
|
|
|
|
SDL_BlitSurface(back, NULL, main_surface, NULL);
|
|
ags_updateFull();
|
|
|
|
SDL_FreeSurface(back);
|
|
|
|
// Remove instruction text
|
|
for (i = 0; i < LOGMSG_LINES; i++) {
|
|
sact.log = list_remove(sact.log, logmsg[i]);
|
|
}
|
|
}
|
|
|
|
void sblog_pageup(void) {
|
|
curline = min(list_length(sact.log), curline + (LOGLINENUM -1));
|
|
draw_log();
|
|
}
|
|
|
|
void sblog_pagedown(void) {
|
|
curline = max(1, curline - (LOGLINENUM -1));
|
|
draw_log();
|
|
}
|
|
|
|
void sblog_pagepre(void) {
|
|
curline = max(1, curline - 1);
|
|
draw_log();
|
|
}
|
|
|
|
void sblog_pagenext(void) {
|
|
curline = min(list_length(sact.log), curline + 1);
|
|
draw_log();
|
|
}
|